在大部份的網路應用裡,TCP 似乎比 UDP 來的多許多,程式人員通常也是對撰寫 TCP 程式比較熟悉,這裡將整理一些 UDP 程式設計的說明,希望對大家有幫助。
一開始先介紹三個最重要的類別,如下:
- DatagramPacket: UDP 的封包。
- DatagramSocket: 用來建立 UDP socket 的類別,包含 client 及 server。
- MulticastSocket: 用來建立群播 UDP socket 的類別,包含 client 和 server。
第一個程式,先寫個比較簡單的,只是點對點的 UDP 傳送,由 client 端送"Hello"這個訊息到 server 端,由 server 端將它顯示出來。
1 package idv.steven; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 8 public class UDPClient { 9 public void run() throws IOException { 10 InetAddress addr = InetAddress.getLocalHost(); 11 String data = "Hello"; 12 byte[] buffer = data.getBytes(); 13 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, 12345); 14 15 DatagramSocket dgSocket = new DatagramSocket(); 16 dgSocket.send(packet); 17 } 18 19 public static void main(String[] args) throws IOException { 20 new UDPClient().run(); 21 } 22 }
上面的程式是 client 端程式,會將"Hello"的訊息送到本機端 port 12345 的 UDP server,DatagramPacket 是在 java.net.* 這個 package 中,所規範的 UDP 網路連線方式,要傳送的封包,封包中除了要傳送的內容外,也封存了要傳送的位址,產生好封包後,透過 DatagramSocket 送出。
1 package idv.steven; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 7 public class UDPServer { 8 public void run() throws IOException { 9 byte[] buffer = new byte[10]; 10 DatagramPacket packet = new DatagramPacket(buffer, 10); 11 DatagramSocket dgSocket = new DatagramSocket(12345); 12 System.out.println("waiting ... (port: " + dgSocket.getLocalPort() +")"); 13 dgSocket.receive(packet); 14 System.out.println("received, content below:"); 15 for(int i = 0; i < buffer.length; i++) { 16 System.out.println(buffer[i]); 17 } 18 } 19 20 public static void main(String[] args) throws IOException { 21 new UDPServer().run(); 22 } 23 }
Server 端的寫法也很簡單,同樣是使用 DatagramSocket 來產生 UDP 服務,建立這個類別時,指定要傾聽的 port 號後,呼叫 receive method,即可進行傾聽,程式在 block 在 receive method,以等待 client 端送來的訊息。當收到訊息時,訊息會被存入 DatagramPacket 中,第 15~17 行將收到的內容顯示出來,這裡顯示出來的是 ASCII 碼。測試時,先啟動 server,再啟動 client。
沒有留言:
張貼留言