Java 網路程式設計 -- UDP

Java 網路程式

簡介

IP

URL

UDP

TCP

Telnet

WebServer

網頁下載

網路爬蟲

Proxy

瀏覽器

訊息

相關網站

參考文獻

最新修改

簡體版

English

在本範例中,我們建立了一個 UDP 封包的 Server,佔用 port 5555,然後利用 UDP Client 連續的發送 100 個封包給 Server。

UDPServer 的工作是,每當收到一個封包就會印出來。但是由於 UDP Client 連續發送封包的速度太快了,導至伺服器來不及接收,於是有些封包因此而遺失了,因此在執行結果中,您會看到 UDPServer 只收到了 55 個封包,而非 UDP Client 所送出的 100 個。

程式範例: UDPServer.java

import java.io.*;
import java.net.*;
 
// 1. 本程式必須與 UdpClient.java 程式搭配執行,先執行本程式再執行 UdpClient。
// 2. 執行方法 : java UdpServer
 
public class UdpServer {
    int port;    // 連接埠
 
    public static void main(String args[]) throws Exception {
        UdpServer server = new UdpServer(5555); // 建立 UdpServer 伺服器物件。
        server.run();                           // 執行該伺服器。
    }
 
    public UdpServer(int pPort) {
        port = pPort;                            // 設定連接埠。
    }
 
    public void run() throws Exception {
        final int SIZE = 8192;                    // 設定最大的訊息大小為 8192.
        byte buffer[] = new byte[SIZE];            // 設定訊息暫存區
        for (int count = 0; ; count++) {
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            DatagramSocket socket = new DatagramSocket(port);         // 設定接收的 UDP Socket.
            socket.receive(packet);                                    // 接收封包。
            String msg = new String(buffer, 0, packet.getLength());    // 將接收訊息轉換為字串。
            System.out.println(count+" : receive = "+msg);                    // 印出接收到的訊息。
            socket.close();                                            // 關閉 UDP Socket.
        }
    }
}

程式範例: UDPClient.java

import java.io.*;
import java.net.*;
 
// 1. 本程式必須與 UdpServer.java 程式搭配執行,先執行 UdpServer 再執行本程式。
// 2. 本程式必須有一個參數,指定伺服器的 IP。
// 用法範例: java UdpClient 127.0.0.1
 
public class UdpClient extends Thread {
    int port;            // port : 連接埠
    InetAddress server; // InetAddress 是 IP, 此處的 server 指的是伺服器 IP
    String msg;            // 欲傳送的訊息,每個 UdpClient 只能傳送一個訊息。
 
    public static void main(String args[]) throws Exception {
        for (int i=0; i<100; i++) {
            // 建立 UdpClient,設定傳送對象與傳送訊息。
            UdpClient client = new UdpClient(args[0], 5555, "UdpClient : "+i+"th message");
            client.run(); // 啟動 UdpClient 開始傳送。
        }
    }
 
    public UdpClient(String pServer, int pPort, String pMsg) throws Exception {
        port = pPort;                             // 設定連接埠
        server = InetAddress.getByName(pServer); // 將伺服器網址轉換為 IP。
        msg = pMsg;                                 // 設定傳送訊息。
    }
 
    public void run() {
      try {
        byte buffer[] = msg.getBytes();                 // 將訊息字串 msg 轉換為位元串。
        // 封裝該位元串成為封包 DatagramPacket,同時指定傳送對象。
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, server, port); 
        DatagramSocket socket = new DatagramSocket();    // 建立傳送的 UDP Socket。
        socket.send(packet);                             // 傳送
        socket.close();                                 // 關閉 UDP socket.
      } catch (Exception e) { e.printStackTrace(); }    // 若有錯誤產生,列印函數呼叫堆疊。
    }
}

執行結果

UDP Server

D:\java>javac UdpServer.java

D:\java>javac UdpClient.java

D:\java>java UdpServer
0 : receive = UdpClient : 0th message
1 : receive = UdpClient : 1th message
2 : receive = UdpClient : 2th message
3 : receive = UdpClient : 3th message
4 : receive = UdpClient : 4th message
5 : receive = UdpClient : 6th message
6 : receive = UdpClient : 10th message
7 : receive = UdpClient : 12th message
8 : receive = UdpClient : 15th message
9 : receive = UdpClient : 16th message
10 : receive = UdpClient : 17th message
11 : receive = UdpClient : 18th message
12 : receive = UdpClient : 19th message
13 : receive = UdpClient : 23th message
14 : receive = UdpClient : 24th message
15 : receive = UdpClient : 29th message
16 : receive = UdpClient : 31th message
17 : receive = UdpClient : 33th message
18 : receive = UdpClient : 34th message
19 : receive = UdpClient : 35th message
20 : receive = UdpClient : 36th message
21 : receive = UdpClient : 37th message
22 : receive = UdpClient : 38th message
23 : receive = UdpClient : 39th message
24 : receive = UdpClient : 41th message
25 : receive = UdpClient : 42th message
26 : receive = UdpClient : 46th message
27 : receive = UdpClient : 49th message
28 : receive = UdpClient : 55th message
29 : receive = UdpClient : 56th message
30 : receive = UdpClient : 57th message
31 : receive = UdpClient : 58th message
32 : receive = UdpClient : 59th message
33 : receive = UdpClient : 60th message
34 : receive = UdpClient : 62th message
35 : receive = UdpClient : 64th message
36 : receive = UdpClient : 66th message
37 : receive = UdpClient : 67th message
38 : receive = UdpClient : 68th message
39 : receive = UdpClient : 70th message
40 : receive = UdpClient : 72th message
41 : receive = UdpClient : 74th message
42 : receive = UdpClient : 76th message
43 : receive = UdpClient : 77th message
44 : receive = UdpClient : 78th message
45 : receive = UdpClient : 79th message
46 : receive = UdpClient : 80th message
47 : receive = UdpClient : 81th message
48 : receive = UdpClient : 82th message
49 : receive = UdpClient : 83th message
50 : receive = UdpClient : 84th message
51 : receive = UdpClient : 85th message
52 : receive = UdpClient : 86th message
53 : receive = UdpClient : 90th message
54 : receive = UdpClient : 94th message
55 : receive = UdpClient : 95th message

UDP Client

D:\java>java UdpClient 127.0.0.1

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License