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

Java 編程那些事兒 105:UDP 網絡編程基礎——DatagramSocket 與 DatagramPacket 詳解

     編輯:Java 相關知識

13.2.4 UDP 編程

網絡通訊除 TCP 外,另一種是 UDP(User Datagram Protocol,用戶數據報協議)。類比:TCP 如打電話(建立連接、可靠傳輸),UDP 如發短信(無需專用連接、成本低、但可能丟失)。重要數據用 TCP,一般數據用 UDP,甚至混合使用。TCP 因建立連接與確認機制,速度稍慢、數據量稍大。

Java API 對 UDP 支持良好,核心類在 java.net 包:

  • DatagramSocket:實現「網絡連接」,充當發送端發射器、接收端監聽器。同一類實現客戶端與服務端連接。
  • DatagramPacket:封裝網絡傳輸數據。發送時包含目標地址、端口、內容;接收時包含發送方地址、端口、內容。類比現實信件,郵局按地址投遞。UDP 中 IO 編程非必需,結構比 TCP 簡單。

UDP 客戶端編程四步驟

1. 建立連接

僅需建立對象,無需指定服務端 IP/端口:

DatagramSocket ds = new DatagramSocket();

系統隨機分配本地未用端口。可指定端口:new DatagramSocket(5000),但客戶端通常無需指定。

2. 發送數據

將內容轉 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 只盡力傳輸,不保證送達。

3. 接收數據

構造緩衝陣列(長度 ≥ 實際數據長度),構造 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 個字節。

4. 關閉連接

ds.close();

釋放系統資源。同一 UDP 連接對象可發送至不同服務端 IP/端口,TCP 做不到。

UDP 服務端編程步驟

1. 建立連接(監聽端口)

DatagramSocket ds = new DatagramSocket(10010);

服務端端口固定,客戶端連接此端口。

2. 接收數據

receive 方法同客戶端,也是阻塞方法,類比 TCP 的 accept。

3. 邏輯處理與回饋

從接收包提取客戶端 IP/端口:

InetAddress clientIP = receiveDp.getAddress();
int clientPort = receiveDp.getPort();

構造回饋包發送。

4. 關閉連接

ds.close();

下節將通過簡單示例演示 UDP 基礎使用。

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