UDP(User Datagram Protocol,使用者資料報協定)位於傳輸層,是無連線、不可靠、無序的傳輸協定。雖缺乏可靠性保證,但因低延遲、低開銷特性,廣泛應用於即時音視訊、遊戲、即時通訊等容忍丟包的場景。本文詳細解析 Java java.net 套件下的 UDP 核心類別與完整收發範例。
InetAddress:IP 位址封裝getLocalHost():取得本機位址getByName(String host):解析主機名/網域名為位址getAllByName(String host):取得所有解析位址陣列DatagramSocket:收發端點建構子:
DatagramSocket():客戶端常用,繫結臨時埠DatagramSocket(int port):伺服端固定監聽埠DatagramSocket(int port, InetAddress localAddr):多網卡主機指定繫結介面核心方法:
receive(DatagramPacket p):阻塞接收資料報send(DatagramPacket p):發送資料報setSoTimeout(int ms):設定接收逾時(毫秒)close():釋放資源,建議在 finally 中呼叫注意: 埠號衝突會拋出 SocketException,必須捕獲處理。
DatagramPacket:資料報封裝封裝位元組陣列、目標位址、埠號。最大資料負載 65,507 位元組(IP 協定限制),實務建議 ≤ 8KB 相容性最佳。
常用建構子:
new DatagramPacket(buf, length, address, port)new DatagramPacket(buf, length)關鍵方法: getData() 取得原始位元組陣列。
public class UdpServer {
public static void main(String[] args) throws IOException {
byte[] buffer = new byte[1024];
DatagramSocket socket = new DatagramSocket(12345); // 監聽 12345 埠
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
System.out.println("UDP Server started on port 12345...");
while (true) {
socket.receive(packet); // 阻塞等待
String received = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
System.out.printf("From %s:%d - %s%n",
packet.getAddress().getHostAddress(),
packet.getPort(),
received);
}
}
}
public class UdpClient {
public static void main(String[] args) throws IOException {
InetAddress target = InetAddress.getByName("localhost"); // 目標位址
DatagramSocket socket = new DatagramSocket(); // 隨機埠發送
String message = "Hello, UDP Server!";
byte[] buffer = message.getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, target, 12345);
socket.send(packet);
System.out.println("Message sent to " + target.getHostAddress() + ":12345");
socket.close();
}
}
receive 後的業務邏輯。DatagramSocket 正確關閉。掌握 UDP 程式設計,是構建高效能即時網路應用的關鍵技能。