UDP(User Datagram Protocol)是無連接、不可靠的傳輸層協議。發送方與接收方無需建立連接,無明確的客戶端/服務端角色區分,數據以「數據報」為單位傳輸。
表示發送/接收數據報包的套接字。
主要構造方法:
DatagramSocket():綁定默認 IP、隨機端口,常用於客戶端。DatagramSocket(int port):指定端口,固定監聽,常用於服務端。DatagramSocket(int port, InetAddress localAddr):多網卡環境下指定綁定 IP。常用方法:
receive(DatagramPacket p):阻塞接收數據到包中。send(DatagramPacket p):發送數據報到目標地址/端口。setSoTimeout(int timeout):設置接收超時(毫秒),防止無限阻塞。close():釋放端口資源,建議在 finally 塊中調用。封裝數據報:字節數組、目標地址、端口、偏移量、長度。
主要構造方法:
DatagramPacket(byte[] buf, int length, InetAddress addr, int port):發送包。DatagramPacket(byte[] buf, int offset, int length, InetAddress addr, int port):發送包(指定偏移)。DatagramPacket(byte[] buf, int length):接收包緩衝區。DatagramPacket(byte[] buf, int offset, int length):接收包緩衝區(指定偏移)。常用方法:getData(), getLength(), getAddress(), getPort(), getOffset()。
// 1. 創建 Socket(隨機端口)
DatagramSocket ds = new DatagramSocket();
// 2. 準備數據與目標
String str = "Hello, Server";
byte[] buf = str.getBytes();
InetAddress addr = InetAddress.getByName("192.168.1.100");
int port = 9999;
// 3. 封裝數據包
DatagramPacket dp = new DatagramPacket(buf, buf.length, addr, port);
// 4. 發送
ds.send(dp);
// 5. 關閉
ds.close();
// 1. 創建 Socket 監聽固定端口
DatagramSocket ds = new DatagramSocket(9999);
// 2. 準備緩衝區與接收包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
// 3. 阻塞接收
ds.receive(dp); // 此處阻塞直到有數據到達
// 4. 解析數據
String received = new String(dp.getData(), 0, dp.getLength());
System.out.println("來自 " + dp.getAddress() + ":" + dp.getPort() + " -> " + received);
// 5. 關閉
ds.close();
DatagramSocket 時若端口被佔用,拋出 SocketException,必須捕獲處理。receive() 會導致線程掛起,直到數據到達或超時(若設置了 setSoTimeout)。getBytes(charset) 與接收端 new String(bytes, charset) 必須使用相同字符集(建議 UTF-8)。IOException,需妥善處理並確保 close() 執行。見原文代碼片段(Server/Client 類)。運行後,客戶端發送 "Hello,I'm client",服務端打印接收消息。
UDP 適合即時性要求高、容忍丟包、數據量小的場景(如視頻流、遊戲心跳、DNS 查詢、日誌傳輸)。Java 提供的 DatagramSocket/DatagramPacket API 簡潔直接,掌握其阻塞模型、緩衝區管理與異常處理是開發高可靠 UDP 應用的基礎。