一、UDP
TCP是面向连接的可靠传输协议,接受方和发送方两个Socket必须建立连接,才能发送数据。
UDP是一种无连接协议,数据报中包含源地址和目的地址,因此无需双方建立连接。
二、服务端
服务端创建DatagramSocket,并绑定端口,使用DatagramPacket接收数据报。
public class UDPServer {
public static void main(String[] args) throws IOException {
// 创建DatagramSocket
DatagramSocket socket = new DatagramSocket(8888);
while (true) {
byte[] data = new byte[1024];
// 创建数据报
DatagramPacket packet = new DatagramPacket(data, data.length);
// receive阻塞,等待发来的数据
socket.receive(packet);
String str = new String(packet.getData(), 0, packet.getLength());
if ("quit".equals(str)) {
break;
}
System.out.println("我是服务器,收到:" + str);
// 可根据数据报获得发送客户端的地址和端口,进行相应数据 packet.getAddress(); packet.getPort();
System.out.println("address:" + packet.getAddress() + " port:" + packet.getPort());
}
// 关闭socket
socket.close();
}
}
三、客户端
创建DatagramSocket,如果不指定端口,系统会生成端口绑定DatagramSocket,作为源端口;创建数据报,数据包包含数据、目的地址、目的端口。
public class UDPClient {
public static void main(String[] args) throws IOException {
// 创建DatagrampSocket实现数据发送和接受,此时也可以指定端口,作为客户端端口;如果不指定,系统会生成端口,绑定socket
DatagramSocket socket = new DatagramSocket();
// InetSocketAddress存放ip和端口
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8888);
// 从键盘读数据
Scanner sc = new Scanner(System.in);
while (true) {
String str = sc.next();
if ("quit".equals(str)) {
break;
}
byte[] data = str.getBytes();
// 创建数据报
DatagramPacket packet = new DatagramPacket(data, data.length, address);
// 发送数据
socket.send(packet);
}
// 关闭socket
socket.close();
}
}