- 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序;
- UDP 数据包通过数据包套接字 DatagramSocket 发送和接收,系统不保证 UDP 数据包一定能安全送达目的地,也不能确定什么时候可以抵达;
- DatagramPacket 对象封装了 UDP 数据包,在数据包中包含了发送端的 IP 地址和端口号,以及接收端的 IP 地址和端口号;
- UDP 协议中每个数据包都给出了完整的地址信息,因此无须建立发送方和接收方的连接;
- 数据被封装到 DatagramPacket 对象装包;
- 当接收到 DatagramPacket 对象,需要进行拆包,取出数据;
- DatagramSocket 可以指定在哪个端口接收数据;

案例
流程:
- 编写一个接收端 Receiver 和一个发送端 Sender;
- 接收端 Receiver 在 9999 端口等待接收数据(receive)
- 发送端 Sender 向接收端 Receiver 发送数据“hello, 明天一起干饭”
- 接收端 Receiver 接收到发送端 A 发送的数据,回复“好的,明天见”,再退出;
- 发送端接收回复的数据,再退出;
Receiver
import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Receiver {public static void main(String[] args) throws Exception {// 创建一个 DatagramSocket 对象,监听 9999 端口,准备接收数据int port = 9999;DatagramSocket socket = new DatagramSocket(port);// 构建一个 DatagramPacket 对象,准备接收数据// UDP 数据包限制最大 64Kbyte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 调用接收方法,将通过网络传输的 DatagramPacket 对象填充到 packet 对象System.out.println("接收端等待接收数据...");socket.receive(packet);// 把接收到的数据拆包,取出数据,并显示int length = packet.getLength(); // 实际接收到的数据字节长度byte[] data = packet.getData(); // 接收到数据String s = new String(data, 0, length);System.out.println(s);// 回复信息给发送者,将消息封装到 DatagramPacket 对象String msg = "好的,明天见。";packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), 9998);// 发送数据包socket.send(packet);// 关闭 socketsocket.close();System.out.println("接收者退出");}}
Sender
import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Sender {public static void main(String[] args) throws Exception {// DatagramSocket 对象,准备发送和接收数据int port = 9998;DatagramSocket socket = new DatagramSocket(port);String msg = "hello, 明天一起干饭";DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), 9999);// 发送数据包socket.send(packet);// 构建一个 DatagramPacket 对象,准备接收返回的数据// UDP 数据包限制最大 64Kbyte[] buffer = new byte[1024];packet = new DatagramPacket(buffer, buffer.length);// 调用接收方法,将通过网络传输的 DatagramPacket 对象填充到 packet 对象System.out.println("等待接收回传数据...");socket.receive(packet);// 把接收到的数据拆包,取出数据,并显示int length = packet.getLength(); // 实际接收到的数据字节长度byte[] data = packet.getData(); // 接收到数据String s = new String(data, 0, length);System.out.println("回传消息:" + s);// UDPsocket.close();System.out.println("发送端退出");}}
