TCP 保證可靠、有序、無重複傳輸,開銷大。UDP 不保證送達、不保證順序,但速度極快,適合語音、遊戲、報時等容忍少量遺失的場景。Java 提供 DatagramSocket(收發端點)與 DatagramPacket(資料封包)對應 UDP。
new DatagramPacket(buf, buf.length) — 僅提供緩衝區,位址/埠號由 receive() 填入。new DatagramPacket(buf, length, InetAddress, port) — 指定目的地。同一 DatagramSocket 可同時收發。緩衝區大小受限於 64KB 以下,實務常用較小封包。
public class Dgram {
public static DatagramPacket toDatagram(String s, InetAddress dest, int port) {
byte[] buf = new byte[s.length() + 1]; // +1 防截斷
s.getBytes(0, s.length(), buf, 0); // Java 1.0 相容寫法
return new DatagramPacket(buf, buf.length, dest, port);
}
public static String toString(DatagramPacket p) {
return new String(p.getData(), 0, p.getLength()); // Java 1.1 建構子
}
}
註解掉的 Java 1.1 getBytes() 會截斷字串,故沿用 1.0 寫法。
DatagramSocket(INPORT=1711),無限迴圈 receive(dp)。Dgram.toDatagram() 建立回應封包,dp.getAddress()/getPort() 直接回覆原發送者。每個 Client 執行緒:自動指派本地埠號、固定目標位址/埠號、發送含執行緒編號與序號的訊息、receive() 阻塞等待回應、驗證回應內容正確性。多執行緒同時運行可驗證伺服器正確分派回應給對應客戶端。
將檔案分割為多個編號封包,接收端重組;標頭封包宣告總數與關鍵資訊;遺失封包以資料報請求重傳。利用 UDP 高速特性實現高效傳輸。