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

image.png

案例

流程:

  • 编写一个接收端 Receiver 和一个发送端 Sender;
  • 接收端 Receiver 在 9999 端口等待接收数据(receive)
  • 发送端 Sender 向接收端 Receiver 发送数据“hello, 明天一起干饭”
  • 接收端 Receiver 接收到发送端 A 发送的数据,回复“好的,明天见”,再退出;
  • 发送端接收回复的数据,再退出;

Receiver

  1. import java.net.DatagramPacket;
  2. import java.net.DatagramSocket;
  3. import java.net.InetAddress;
  4. public class Receiver {
  5. public static void main(String[] args) throws Exception {
  6. // 创建一个 DatagramSocket 对象,监听 9999 端口,准备接收数据
  7. int port = 9999;
  8. DatagramSocket socket = new DatagramSocket(port);
  9. // 构建一个 DatagramPacket 对象,准备接收数据
  10. // UDP 数据包限制最大 64K
  11. byte[] buffer = new byte[1024];
  12. DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
  13. // 调用接收方法,将通过网络传输的 DatagramPacket 对象填充到 packet 对象
  14. System.out.println("接收端等待接收数据...");
  15. socket.receive(packet);
  16. // 把接收到的数据拆包,取出数据,并显示
  17. int length = packet.getLength(); // 实际接收到的数据字节长度
  18. byte[] data = packet.getData(); // 接收到数据
  19. String s = new String(data, 0, length);
  20. System.out.println(s);
  21. // 回复信息给发送者,将消息封装到 DatagramPacket 对象
  22. String msg = "好的,明天见。";
  23. packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), 9998);
  24. // 发送数据包
  25. socket.send(packet);
  26. // 关闭 socket
  27. socket.close();
  28. System.out.println("接收者退出");
  29. }
  30. }

Sender

  1. import java.net.DatagramPacket;
  2. import java.net.DatagramSocket;
  3. import java.net.InetAddress;
  4. public class Sender {
  5. public static void main(String[] args) throws Exception {
  6. // DatagramSocket 对象,准备发送和接收数据
  7. int port = 9998;
  8. DatagramSocket socket = new DatagramSocket(port);
  9. String msg = "hello, 明天一起干饭";
  10. DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length, InetAddress.getLocalHost(), 9999);
  11. // 发送数据包
  12. socket.send(packet);
  13. // 构建一个 DatagramPacket 对象,准备接收返回的数据
  14. // UDP 数据包限制最大 64K
  15. byte[] buffer = new byte[1024];
  16. packet = new DatagramPacket(buffer, buffer.length);
  17. // 调用接收方法,将通过网络传输的 DatagramPacket 对象填充到 packet 对象
  18. System.out.println("等待接收回传数据...");
  19. socket.receive(packet);
  20. // 把接收到的数据拆包,取出数据,并显示
  21. int length = packet.getLength(); // 实际接收到的数据字节长度
  22. byte[] data = packet.getData(); // 接收到数据
  23. String s = new String(data, 0, length);
  24. System.out.println("回传消息:" + s);
  25. // UDP
  26. socket.close();
  27. System.out.println("发送端退出");
  28. }
  29. }