| 類 | 核心作用 | 關鍵構造器/方法 |
|---|---|---|
| InetAddress | IP 地址封裝 | getByName(host), getLocalHost(), getAllByName(host) |
| DatagramSocket | 發送/接收端口 | new DatagramSocket(), new DatagramSocket(port), new DatagramSocket(port, bindAddr) receive(p), send(p), setSoTimeout(ms), close() |
| DatagramPacket | 數據報封裝 | new DatagramPacket(buf, len, addr, port) 發送 new DatagramPacket(buf, len) 接收 getData(), getLength(), getAddress(), getPort() |
public class UdpServer {
public static void main(String[] args) throws IOException {
try (DatagramSocket socket = new DatagramSocket(12345)) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
System.out.println("UDP Server listening on 12345...");
while (true) {
socket.receive(packet); // 阻塞
String msg = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
System.out.printf("從 %s:%d 收到:%s%n",
packet.getAddress(), packet.getPort(), msg);
// 可選:原路回複
// socket.send(packet);
}
}
}
}
public class UdpClient {
public static void main(String[] args) throws IOException {
InetAddress target = InetAddress.getByName("localhost");
try (DatagramSocket socket = new DatagramSocket()) { // 隨機端口
String msg = "Hello UDP!";
byte[] data = msg.getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(data, data.length, target, 12345);
socket.send(packet);
System.out.println("已發送:" + msg);
}
}
}
socket.setSoTimeout(3000); // 3 秒無數據拋 SocketTimeoutException
try {
socket.receive(packet);
} catch (SocketTimeoutException e) {
// 處理超時邏輯
}
// 組播
InetAddress group = InetAddress.getByName("239.255.0.1");
MulticastSocket ms = new MulticastSocket(5000);
ms.joinGroup(group);
// 接收/發送同 DatagramSocket
ms.leaveGroup(group);
// 廣播(需網卡支援)
DatagramSocket bc = new DatagramSocket();
bc.setBroadcast(true);
bc.send(new DatagramPacket(data, data.length, InetAddress.getByName("255.255.255.255"), 9999));
new byte[65507] 或根據 MTU 設置。packet.setLength(buf.length) 重用包時長度不重置。DatagramSocket 發送安全,接收需同步或單線程輪詢。