網絡通訊除 TCP 外,另一種是 UDP(User Datagram Protocol,用戶數據報協議)。類比:TCP 如打電話(建立連接、可靠傳輸),UDP 如發短信(無需專用連接、成本低、但可能丟失)。重要數據用 TCP,一般數據用 UDP,甚至混合使用。TCP 因建立連接與確認機制,速度稍慢、數據量稍大。
Java API 對 UDP 支持良好,核心類在 java.net 包:
僅需建立對象,無需指定服務端 IP/端口:
DatagramSocket ds = new DatagramSocket();
系統隨機分配本地未用端口。可指定端口:new DatagramSocket(5000),但客戶端通常無需指定。
將內容轉 byte 陣列,目標 IP 轉 InetAddress,構造 DatagramPacket,調用 send:
String s = "Hello";
String host = "127.0.0.1";
int port = 10001;
byte[] b = s.getBytes();
InetAddress server = InetAddress.getByName(host);
DatagramPacket sendDp = new DatagramPacket(b, b.length, server, port);
ds.send(sendDp);
發送數據、目標 IP、端口全封裝在 DatagramPacket 中。UDP 只盡力傳輸,不保證送達。
構造緩衝陣列(長度 ≥ 實際數據長度),構造 DatagramPacket,調用 receive:
byte[] data = new byte[1024];
DatagramPacket receiveDp = new DatagramPacket(data, data.length);
ds.receive(receiveDp);
byte[] b = receiveDp.getData();
int len = receiveDp.getLength();
String s = new String(b, 0, len);
System.out.println(s);
receive 內部修改包對象內容。getData 取緩衝區,getLength 取有效長度,有效數據為緩衝區前 len 個字節。
ds.close();
釋放系統資源。同一 UDP 連接對象可發送至不同服務端 IP/端口,TCP 做不到。
DatagramSocket ds = new DatagramSocket(10010);
服務端端口固定,客戶端連接此端口。
receive 方法同客戶端,也是阻塞方法,類比 TCP 的 accept。
從接收包提取客戶端 IP/端口:
InetAddress clientIP = receiveDp.getAddress();
int clientPort = receiveDp.getPort();
構造回饋包發送。
ds.close();
下節將通過簡單示例演示 UDP 基礎使用。