在 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 伺服器比客戶端更簡單,核心流程如下:
DatagramSocketreceive() 封鎖等待封包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 提升並發能力。