Google Code Prettify

2014年5月31日 星期六

java.io: UDP 網路程式設計 getting started

在大部份的網路應用裡,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。

沒有留言:

張貼留言