實驗課上測試的源碼。
1)伺服器端
Code:
- import java.io.*;
- import java.net.*;
-
- //伺服器端
- public class UDPServerTest {
- static public void main(String args[]) {
- DatagramSocket receiveSocket = null;
- try {
- //DatagramSocket(int port):建立執行個體,並固定監聽Port連接埠的報文。通常用於服務端
- receiveSocket = new DatagramSocket(55511);
- byte buf[] = new byte[1000];
- //DatagramPacket(byte[] buf, int length):將資料包中Length長的資料裝進Buf數組,一般用來接收用戶端發送的資料。
- DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
- System.out.println("開始接受資料:");
- boolean flag = true; //作為接收完之後退出的標記
- while (flag) {
- //接收資料報文到d中。receive方法產生一個“阻塞”。“阻塞”是一個專業名詞,它會產生一個內部迴圈,
- //使程式暫停在這個地方,直到一個條件觸發。
- receiveSocket.receive(receivePacket);
- String name = receivePacket.getAddress().toString();
- System.out.println("/n來自主機:" + name + "/n連接埠:"
- + receivePacket.getPort());
- //從執行個體中取得報文的Byte數組編碼
- String s = new String(receivePacket.getData(), 0, receivePacket
- .getLength());
- System.out.println("接受到的資料是: " + s);
- flag = false;
- //需關閉串連,也關閉連接埠。
- receiveSocket.close();
- }
- } catch (SocketException e) {
- receiveSocket.close();
- e.printStackTrace();
- System.exit(-1);
- } catch (IOException e) {
- receiveSocket.close();
- System.out.println("網路通訊出現錯誤,問題在" + e.toString());
- }
- }
- }
2)用戶端
Code:
- import java.io.*;
- import java.net.*;
-
- //用戶端
- public class UDPClientTest {
- public static void main(String args[]) {
- DatagramSocket sendSocket = null;
- try {
- //DatagramSocket():通常用於用戶端編程,它並沒有特定監聽的連接埠,僅僅使用一個臨時的。程式會讓作業系統分配一個可用的連接埠。
- // DatagramSocket(int port):建立執行個體,並固定監聽Port連接埠的報文。通常用於服務端
- sendSocket = new DatagramSocket();
- String string = "who a u 沒死過,不知道dead的感覺";
- byte[] databyte = new byte[100];
- databyte = string.getBytes();
- //從Buf數組中,取出Length長的資料建立資料包對象,目標是clientAddress地址,clientPort連接埠,通常用來發送資料給用戶端。 此處事發送給伺服器端
- DatagramPacket sendPacket = new DatagramPacket(databyte,
- databyte.length, InetAddress.getByName("222.17.97.152"),
- 55511);
- //發送報文sendPacket到目的地
- sendSocket.send(sendPacket);
- System.out.println("用戶端開始傳送資料!");
- sendSocket.close();
- } catch (SocketException e) {
- sendSocket.close();
- e.printStackTrace();
- System.out.println("不能開啟資料報Socket,或資料報Socket無法與指定連接埠串連!");
- } catch (IOException ioe) {
- sendSocket.close();
- System.out.println(ioe.toString());
- }
- }
- }
總結:異常或正常退出時,最好調用close方法,否則可能造成資源無法收回。