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

Java UDP 雙向通訊實作:DatagramSocket 完整範例

     編輯:Java 相關知識

基於 UDP 的簡易聊天雛形:發送與接收執行緒分離

UDP(User Datagram Protocol)無連線、低延遲,適合即時通訊、廣播、遊戲同步等場景。本範例展示單一 JVM 內啟動「發送執行緒」與「接收執行緒」,分別綁定不同 Port(3000 發送、9000 接收),透過指定目標 IP 實現雙向資料交換。

架構圖解

[主執行緒 main]
   ├─→ new ReciveThread().start()  // 監聽 Port 9000,無限循環接收
   └─→ new SendInfo().main(args)   // 讀取鍵盤輸入,發送至目標 IP:Port

核心程式碼精要

發送端

// 手動組裝目標 IP(10.1.1.200)與 Port 9000
byte[] ip = {(byte)10, 1, 1, (byte)200};
InetAddress target = InetAddress.getByAddress(ip);

DatagramSocket ds = new DatagramSocket(3000); // 本地綁定發送 Port
DatagramPacket dp = new DatagramPacket(data, data.length, target, 9000);
ds.send(dp);
ds.close(); // 每次發送後關閉(範例簡化,實際建議複用 Socket)

接收端

// 在獨立執行緒中無限循環
DatagramSocket ds = new DatagramSocket(9000); // 綁定接收 Port
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); // 阻塞等待資料
String msg = new String(dp.getData(), 0, dp.getLength()) 
           + " from " + dp.getAddress().getHostAddress() 
           + ":port " + dp.getPort();
System.out.println(msg);
ds.close();

關鍵注意事項

  1. 防火牆:Windows 7+ 預設阻擋 UDP,需開放對應 Port 或關閉防火牆測試。
  2. 同機測試:目標 IP 應為對方實際 IP,非 127.0.0.1(除非雙進程同機且 Port 不衝突)。
  3. 資料邊界:UDP 單包最大 64KB,超長訊息需自行分片重組。
  4. 可靠性:UDP 不保證送達、不保證順序,重要資料需應用層加 ACK/重傳機制。
  5. 資源管理:範例為教學簡化每次收發開關 Socket,生產環境應建立單例 Socket 複用,並在關閉時釋放。

擴展練習

  • 加入簡易協議頭(序號、類型、長度)實現可靠傳輸。
  • 使用 MulticastSocket 實現區域網廣播發現。
  • 整合 Netty 的 NioDatagramChannel 獲得高效能非阻塞 UDP 支援。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved