Socket
定义:
两个java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket
Socket通常用来实现client-server连接java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端建立连接时所需的寻址信息为远程计算机的IP地址和端口号(prot number)
TCP协议/UDP协议
TCP(transmission control protocol)
是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议,它是一种面向连接的协议。TCP连接是字节流而非报文流
UDP(user data protocol)
UDP向应用程序提供一种发送封装的原始IP数据的方法、并且发送时无需建立连接。是一种不可靠的连接(例\音频、视频)
TCP示例
import java.net.*;
import java.io.*;
//Socket服务端
public class TcpSocketService{
public static void main(String args[]){
try{
ServerSocket ss = new ServerSocket(5678);
Socket s = ss.accept();
InputStream in = s.getInputStream();
DataInputStream dis = new DataInputStream(in);
System.out.println(dis.readUTF());
dis.close();
s.close();
System.out.println("=="+s.getInetAddress()+"==="+s.getLocalPort());
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
----------------------------------------------------
import java.net.*;
import java.io.*;
//client
public class TcpSocketClient{
public static void main(String args[]){
try{
Socket s = new Socket("localhost",5678);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("hello server");
dos.flush();
dos.close();
s.close();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
UDP示例
import java.net.*;
import java.io.*;
public class UdpServer
{
public static void main(String args[]) throws Exception{
byte[] buf = new byte[1024];
//此类表示数据报包
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//此类表示用来发送和接收数据报包的套接字。
DatagramSocket ds = new DatagramSocket(6666);
while(true){
//接收数据报包
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
//Long类型
System.out.println(dis.readLong());
//字符串类型
//System.out.println(new String(buf,0,dp.getLength()));
//ds.close();
}
}
}
-----------------------------------------------------------------------------------
import java.net.*;
import java.io.*;
public class UdpClient
{
public static void main(String args[]) throws Exception{
//发送long类型
long l = 10000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(l);
byte[] buf = baos.toByteArray();
//byte[] buf = (new String("hello")).getBytes();
//此类表示数据报包
DatagramPacket dp = new
DatagramPacket(buf,buf.length,new InetSocketAddress("http://www.eshow365.cn",6666));
//此类表示用来发送和接收数据报包的套接字。8888向6666发送数据
DatagramSocket ds = new DatagramSocket(8888);
//发送数据报包
ds.send(dp);
ds.close();
}
}