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

Java UDP 程式設計實戰:從協定特性到 DatagramSocket 完整範例

     編輯:Java 程式設計入門

UDP(User Datagram Protocol,使用者資料報協定)位於傳輸層,是無連線、不可靠、無序的傳輸協定。雖缺乏可靠性保證,但因低延遲、低開銷特性,廣泛應用於即時音視訊、遊戲、即時通訊等容忍丟包的場景。本文詳細解析 Java java.net 套件下的 UDP 核心類別與完整收發範例。

核心類別架構

InetAddress:IP 位址封裝

  • getLocalHost():取得本機位址
  • getByName(String host):解析主機名/網域名為位址
  • getAllByName(String host):取得所有解析位址陣列

DatagramSocket:收發端點

建構子:

  • DatagramSocket():客戶端常用,繫結臨時埠
  • DatagramSocket(int port):伺服端固定監聽埠
  • DatagramSocket(int port, InetAddress localAddr):多網卡主機指定繫結介面

核心方法:

  • receive(DatagramPacket p):阻塞接收資料報
  • send(DatagramPacket p):發送資料報
  • setSoTimeout(int ms):設定接收逾時(毫秒)
  • close():釋放資源,建議在 finally 中呼叫

注意: 埠號衝突會拋出 SocketException,必須捕獲處理。

DatagramPacket:資料報封裝

封裝位元組陣列、目標位址、埠號。最大資料負載 65,507 位元組(IP 協定限制),實務建議 ≤ 8KB 相容性最佳。

常用建構子:

  • 發送端:new DatagramPacket(buf, length, address, port)
  • 接收端:new DatagramPacket(buf, length)

關鍵方法: getData() 取得原始位元組陣列。

完整收發範例

伺服端(接收)

public class UdpServer {
    public static void main(String[] args) throws IOException {
        byte[] buffer = new byte[1024];
        DatagramSocket socket = new DatagramSocket(12345); // 監聽 12345 埠
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        System.out.println("UDP Server started on port 12345...");
        while (true) {
            socket.receive(packet); // 阻塞等待
            String received = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
            System.out.printf("From %s:%d - %s%n",
                packet.getAddress().getHostAddress(),
                packet.getPort(),
                received);
        }
    }
}

客戶端(發送)

public class UdpClient {
    public static void main(String[] args) throws IOException {
        InetAddress target = InetAddress.getByName("localhost"); // 目標位址
        DatagramSocket socket = new DatagramSocket(); // 隨機埠發送
        String message = "Hello, UDP Server!";
        byte[] buffer = message.getBytes("UTF-8");

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, target, 12345);
        socket.send(packet);
        System.out.println("Message sent to " + target.getHostAddress() + ":12345");
        socket.close();
    }
}

實務考量與最佳實踐

  • 封包大小: 乙太網路 MTU 通常 1500 位元組,扣除 IP/UDP 頭部建議應用層資料 ≤ 1472 位元組避免分片。
  • 可靠性補強: 應用層實作序號、ACK、重傳、檢查和(如 QUIC 協定思路)。
  • 多執行緒: 高併發伺服端建議使用執行緒池處理 receive 後的業務邏輯。
  • 資源管理: 善用 try-with-resources 確保 DatagramSocket 正確關閉。

掌握 UDP 程式設計,是構建高效能即時網路應用的關鍵技能。

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