jUDP 协议是一种对等通信的实现,发送方之需要接受方的 IP 和 Port,就可以直接向它发送数据,不需要先连接。UDP 是一种无连接的传输协议,每个数据报的大小限制在 64KB 内。数据报是一个在网络上发送的独立信息,它到达时间以及内容本身都不能得到保证。这种传输方式是无需的,也不能确保绝对的安全可靠,但它很简单也具有较高的效率。
使用 UDP 协议进行数据传输,需要将传输数据定义为数据报(DatagramPaket),在数据报中指明所需要到达 Socket(主机地址和端口号),然后再将数据报发送出去。
实例化 DatagramPacket 时使用参数 port 和没有 port 参数的区别在于,提供 port 的一方可以让别人主动发送消息过来,而没有 Port 参数则会在发送消息时自动绑定一个本地没有使用的端口。在接收到发送的数据报时,不仅可以获取数据,还可以获取发送方的 IP 和 Port,这样就可以向发送方发送数据。
复制 // 创建一个缓冲区
byte[] sendMsgBytes = "Hello World!".getBytes();
// 创建发送端 Socket 对象
try (DatagramSocket sendSocket = new DatagramSocket();) {
// 获取本机通信地址
InetAddress address = InetAddress.getLocalHost();
// 打包数据
DatagramPacket sendPacket = new DatagramPacket(sendMsgBytes, 0, sendMsgBytes.length, address, 8080);
// 发送数据
sendSocket.send(sendPacket);
// 发送端等待接收端接收成功后的回应
// 创建一个缓冲区,容量尽量设置大一点因为不知道发送过来的信息有多大
byte[] receiveByte = new byte[1024 * 1024];
// 接受数据报
DatagramPacket receivePacket = new DatagramPacket(receiveByte, 0, receiveByte.length);
// 接收数据
sendSocket.receive(receivePacket);
// 获取接收端发送过来的真实长度以及数据
byte[] data = receivePacket.getData();
int dateLen = receivePacket.getLength();
String receiveMessage = new String(data, 0, dateLen);
// 获取发送者的IP
System.out.println("接收来自 " + receivePacket.getAddress().getHostAddress() + " 的消息:" + receiveMessage);
} catch (IOException e) {
throw new RuntimeException(e);
}
复制 try (DatagramSocket receiveSocket = new DatagramSocket(8080)) {
// 设置缓冲区接收发过来的信息
byte[] receiveBytes = new byte[1024 * 1024];
// 接收数据报
DatagramPacket receivePacket = new DatagramPacket(receiveBytes, 0, receiveBytes.length);
// 接收数据
receiveSocket.receive(receivePacket);
byte[] data = receivePacket.getData();
int dateLen = receivePacket.getLength();
String receiveMessage = new String(data);
System.out.println("接收到来自 " + receivePacket.getAddress().getHostAddress() + " 的消息:" + receiveMessage);
// 接收端接收到信息后发送一条确认接收的消息到发送端
String message = "OK,数据我已经接收并处理了";
byte[] messageByte = message.getBytes();
//构造新数据报
DatagramPacket sendPacket = new DatagramPacket(messageByte, messageByte.length, receivePacket.getAddress(), receivePacket.getPort());
// 发送数据
receiveSocket.send(sendPacket);
// 关闭资源
} catch (IOException e) {
throw new RuntimeException(e);
}