1. 程式人生 > >JAVA網路程式設計之UDP通訊的實現步驟

JAVA網路程式設計之UDP通訊的實現步驟

與TCP相比,UDP是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。UDP通訊主要用到兩個類DatagramPacket和DatagramSocket,下面分別介紹。

1、DatagramSocket

此類表示用來發送和接收資料報包的套接字。

資料報套接字是包投遞服務的傳送或接收點。每個在資料報套接字上傳送或接收的包都是單獨編址和路由的。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。

在 DatagramSocket 上總是啟用 UDP 廣播發送。為了接收廣播包,應該將 DatagramSocket 繫結到萬用字元地址。在某些實現中,將 DatagramSocket 繫結到一個更加具體的地址時廣播包也可以被接收。

構造方法:

DatagramSocket() ~ 構造資料報套接字並將其繫結到本地主機上任何可用的埠。

protected DatagramSocket(DatagramSocketImpl impl) ~建立帶有指定 DatagramSocketImpl (資料報和多播套接字實現的抽象基類,可以通過它將資料報套接字繫結到本地埠和地址。)的未繫結資料報套接字。

DatagramSocket(int port) ~建立資料報套接字並將其繫結到本地主機上的指定埠。 
DatagramSocket(int port, InetAddress laddr) ~建立資料報套接字,將其繫結到指定的本地地址。

DatagramSocket(SocketAddress bindaddr) ~建立資料報套接字,將其繫結到指定的本地套接字地址。 (SocketAddress 作為一個抽象類,應通過特定的、協議相關的實現為其建立子類。 它提供不可變物件,供套接字用於繫結、連線或用作返回值。 )

DatagramSocket(DatagramSocketImpl impl)和DatagramSocket(SocketAddress bindaddr)就是通過一個物件來進行本地埠和地址的繫結……。

2、DatagramPacket

此類表示資料報包。

資料報包用來實現無連線包投遞服務。每條報文僅根據該包中包含的資訊從一臺機器路由到另一臺機器。從一臺機器傳送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證

3、通訊過程


基於UDP的套接字就是資料報套接字(Java.net.DatagramSocketj)。

兩個都要先構造好相應的資料包(java.net.DatagramPacket)。


在DatagramPacket包中的函式 intgetLength()返回實際接受的位元組數, byte[]getData()返回接受到的資料。

要想接受端給傳送端回信息,就需要知道傳送端的IP地址InetAddress getAddress()和傳送端程序所繫結的埠號int getPort()。

資料報套接字傳送成功之後,就相當於建立了一個虛連線,雙方可以傳送資料。

4、具體示例(客戶端訪問伺服器端)

伺服器端:

/*
 * 伺服器端,實現基於UDP的使用者登陸
 */
public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客戶端傳送的資料
         */
        // 1.建立伺服器端DatagramSocket,指定埠
        DatagramSocket socket = new DatagramSocket(8800);
        // 2.建立資料報,用於接收客戶端傳送的資料
        byte[] data = new byte[1024];// 建立位元組陣列,指定接收的資料包的大小
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // 3.接收客戶端傳送的資料
        System.out.println("****伺服器端已經啟動,等待客戶端傳送資料");
        socket.receive(packet);// 此方法在接收到資料報之前會一直阻塞
        // 4.讀取資料
        String info = new String(data, 0, packet.getLength());
        System.out.println("我是伺服器,客戶端說:" + info);

        /*
         * 向客戶端響應資料
         */
        // 1.定義客戶端的地址、埠號、資料
        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        byte[] data2 = "歡迎您!".getBytes();
        // 2.建立資料報,包含響應的資料資訊
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
        // 3.響應客戶端
        socket.send(packet2);
        // 4.關閉資源
        socket.close();
    }
}

客戶端:

/*
 * 客戶端
 */
public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向伺服器端傳送資料
         */
        // 1.定義伺服器的地址、埠號、資料
        InetAddress address = InetAddress.getByName("localhost");
        int port = 8800;
        byte[] data = "使用者名稱:admin;密碼:123".getBytes();
        // 2.建立資料報,包含傳送的資料資訊
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
        // 3.建立DatagramSocket物件
        DatagramSocket socket = new DatagramSocket();
        // 4.向伺服器端傳送資料報
        socket.send(packet);

        /*
         * 接收伺服器端響應的資料
         */
        // 1.建立資料報,用於接收伺服器端響應的資料
        byte[] data2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
        // 2.接收伺服器響應的資料
        socket.receive(packet2);
        // 3.讀取資料
        String reply = new String(data2, 0, packet2.getLength());
        System.out.println("我是客戶端,伺服器說:" + reply);
        // 4.關閉資源
        socket.close();
    }
}
完!!!