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

Java Socket 程式設計(四):UDP 資料報與回應式伺服器實作

     編輯:Java 相關知識

UDP 資料報傳輸機制

在 Java 網路程式設計中,UDP(User Datagram Protocol)屬於無連線協定,資料傳輸單位為「資料報」。發送資料前,必須先將字串轉換為位元組陣列,再封裝成 DatagramPacket 物件。建構子需指定目的地址與埠號,這點與 TCP 的連線導向模式截然不同。

發送資料報範例

String toSend = "This is the data to send!";
byte[] sendbuf = new byte[toSend.length()];
toSend.getBytes(0, toSend.length(), sendbuf, 0);
InetAddress addr = InetAddress.getByName("localhost");
int port = 4545;
DatagramPacket sendPacket = new DatagramPacket(sendbuf, sendbuf.length, addr, port);
clientSocket.send(sendPacket);

資料報伺服器架構

UDP 伺服器比客戶端更簡單,核心流程如下:

  1. 在指定埠建立 DatagramSocket
  2. 呼叫 receive() 封鎖等待封包
  3. 從接收封包取得發送者位址與埠號
  4. 建立回應封包並送出
  5. 迴圈處理下一個請求

簡易回應伺服器實作

public class SimpleDatagramServer {
    public static void main(String[] args) {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(4545);
            byte[] buffer = new byte[512];
            while (true) {
                DatagramPacket recvPacket = new DatagramPacket(buffer, buffer.length);
                socket.receive(recvPacket);
                DatagramPacket sendPacket = new DatagramPacket(
                    recvPacket.getData(), recvPacket.getLength(),
                    recvPacket.getAddress(), recvPacket.getPort()
                );
                socket.send(sendPacket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) socket.close();
        }
    }
}

注意:receive() 會封鎖執行緒直到收到資料,此範例為迭代式伺服器,一次只能處理一個請求。生產環境建議採用多執行緒或非阻塞 I/O 提升並發能力。

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