核心類
DatagramSocket:UDP 套接字,綁定端口收發數據報。
DatagramPacket:數據報封裝,含數據緩衝區、長度、目標/源地址端口。
InetAddress:IP 地址封裝。
服務端(發送方)
package test;
import java.io.IOException;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(3000); // 綁定本地端口 3000
String str = "Hello";
byte[] buf = str.getBytes();
InetAddress ia = InetAddress.getByName("localhost");
DatagramPacket dp = new DatagramPacket(buf, buf.length, ia, 9000); // 目標 9000
ds.send(dp);
ds.close();
}
}
客戶端(接收方)
package test;
import java.io.IOException;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(9000); // 綁定本地端口 9000
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); // 阻塞等待
String received = new String(dp.getData(), 0, dp.getLength());
String info = received + " from " + dp.getAddress().getHostAddress() + ":" + dp.getPort();
System.out.println(info);
ds.close();
}
}
關鍵點總結
| 項目 | 說明 |
| 無連接 | UDP 不建立連接,每個包獨立寻址 |
| 不可靠 | 可能丟包、重複、亂序,應用層需自行處理 |
| 發送端口 | new DatagramSocket(localPort) 綁定發送端口 |
| 接收緩衝 | 需預分配 byte[],長度 ≥ 最大預期包 |
| 獲取發送者 | dp.getAddress(), dp.getPort() |
| 數據長度 | dp.getLength() 為實際收到字節數 |
常見坑
- 防火牆攔截 UDP 端口,需放行。
- 接收緩衝區太小導致數據截斷。
- 廣播/組播需設置
setBroadcast(true) / joinGroup()。
- 高併發下建議用
NIO DatagramChannel 替代阻塞 API。
- 上一篇文章: HDU 1689 Alien's Necklace:BFS 求最小奇數環
- 下一篇文章: 平衡二叉樹判斷:遞歸後序遍歷兩種寫法對比
Copyright ©
程式碼之家 All Rights Reserved