java如何用udp
使用UDP进行网络通信的步骤
在Java中,UDP通信主要通过DatagramSocket和DatagramPacket类实现。UDP是一种无连接的协议,适用于对实时性要求高但允许少量丢包的场景。
发送UDP数据包
创建DatagramSocket对象,无需指定端口(系统随机分配)或指定发送方端口。构造DatagramPacket时需指定目标地址和端口。
DatagramSocket socket = new DatagramSocket();
byte[] sendData = "Hello UDP".getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData,
sendData.length,
InetAddress.getByName("目标IP"),
目标端口
);
socket.send(sendPacket);
socket.close();
接收UDP数据包
创建DatagramSocket并绑定到指定端口。通过DatagramPacket接收数据,需提前分配缓冲区。
DatagramSocket socket = new DatagramSocket(监听端口);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket); // 阻塞等待数据
String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
socket.close();
完整示例:双向通信
以下代码展示客户端发送消息、服务端接收并回复的流程:
服务端代码:
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
// 发送回复
byte[] sendData = ("ECHO: " + clientMessage).getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData,
sendData.length,
receivePacket.getAddress(),
receivePacket.getPort()
);
serverSocket.send(sendPacket);
}
客户端代码:

DatagramSocket clientSocket = new DatagramSocket();
byte[] sendData = "Ping".getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData,
sendData.length,
InetAddress.getByName("localhost"),
9876
);
clientSocket.send(sendPacket);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String serverResponse = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("Server says: " + serverResponse);
clientSocket.close();
注意事项
- UDP数据包大小限制为64KB(包括头部),实际应用通常限制在1500字节以下以避免分片。
receive()方法是阻塞调用,需放在独立线程处理以避免界面卡顿。- 可通过
setSoTimeout(int milliseconds)设置接收超时,超时后抛出SocketTimeoutException。 - 多网卡环境下需注意绑定正确的网络接口地址。






