首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java SE 網絡編程:UDP 協議詳解與實戰(二)

     編輯:Java 綜合教學

Java SE 網絡編程:UDP 協議詳解與實戰(二)

UDP(User Datagram Protocol)是無連接、不可靠的傳輸層協議。發送方與接收方無需建立連接,無明確的客戶端/服務端角色區分,數據以「數據報」為單位傳輸。

核心類解析

DatagramSocket

表示發送/接收數據報包的套接字。

主要構造方法:

  • DatagramSocket():綁定默認 IP、隨機端口,常用於客戶端。
  • DatagramSocket(int port):指定端口,固定監聽,常用於服務端。
  • DatagramSocket(int port, InetAddress localAddr):多網卡環境下指定綁定 IP。

常用方法:

  • receive(DatagramPacket p):阻塞接收數據到包中。
  • send(DatagramPacket p):發送數據報到目標地址/端口。
  • setSoTimeout(int timeout):設置接收超時(毫秒),防止無限阻塞。
  • close():釋放端口資源,建議在 finally 塊中調用。

DatagramPacket

封裝數據報:字節數組、目標地址、端口、偏移量、長度。

主要構造方法:

  • 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();

關鍵注意點

  1. 端口衝突:創建 DatagramSocket 時若端口被佔用,拋出 SocketException,必須捕獲處理。
  2. 阻塞特性:receive() 會導致線程掛起,直到數據到達或超時(若設置了 setSoTimeout)。
  3. 數據截斷:緩衝區大小限制單個數據報最大長度(理論上限 64KB,實際受 MTU 限制通常 < 1500 字節)。超長數據需應用層分片重組。
  4. 編碼一致性:發送端 getBytes(charset) 與接收端 new String(bytes, charset) 必須使用相同字符集(建議 UTF-8)。
  5. 異常處理:網絡操作拋出 IOException,需妥善處理並確保 close() 執行。

完整示例:雙向通信

見原文代碼片段(Server/Client 類)。運行後,客戶端發送 "Hello,I'm client",服務端打印接收消息。

總結

UDP 適合即時性要求高、容忍丟包、數據量小的場景(如視頻流、遊戲心跳、DNS 查詢、日誌傳輸)。Java 提供的 DatagramSocket/DatagramPacket API 簡潔直接,掌握其阻塞模型、緩衝區管理與異常處理是開發高可靠 UDP 應用的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved