基於UDP協定的Socket通信


本節引言:

本節帶給大家Socket的最後一節:基於UDP協定的Socket通信,在第一節我們已經詳細地 比較了兩者的差異,TCP和UDP最大的差異在於是否需要客戶端與服務端建立連線後才能進行 資料傳輸,如果你學了前兩節TCP的,傳輸前先開服務端,accept,等客戶端接入,然後獲得 客戶端socket接著進行IO操作,而UDP則不用,UDP以資料封包作為資料的傳輸載體,在進行傳輸時 首先要把傳輸的資料定義成資料報(Datagram),在資料報中指明資料要到達的Socket(主機位址 和連接埠號碼),然後再將資料以資料封包的形式發送出去,然後就沒有然後了,服務端收不收到我就 不知道了,除非服務端收到後又回我一段確認的資料報~時間關係就不另外寫Android範例了 直接上Java程式碼~


1.服務端實作步驟:

#Step 1:建立DatagramSocket,指定連接埠號碼
Step 2:建立DatagramPacket
Step 3:接收客戶端所傳送的資料資訊
##Step 4:讀取資料

#範例程式碼

public class UPDServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客户端发送的数据
         */
        // 1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket = new DatagramSocket(12345);
        // 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();
    }
}


2.客戶端實作步驟:

Step 1:定義傳送訊息
Step 2:建立DatagramPacket,包含將要傳送的訊息
Step 3:建立DatagramSocket
Step 4:傳送數據

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();
    }
}
本節小結:

本節內容比較簡單,無非就是將資料轉換為位元組,然後放到

DatagramPacket(資料封包中),發送的 時候帶上接受者的IP位址和連接埠號,而接收時,用一個位元組數組來快取!發送的時候需要建立一個DatagramSocket(端對端通訊的類別)對象,然後呼叫send方法給接受者傳送資料封包~ 本節程式碼來自慕客網路上的一個JavaSocket教學~有興趣的可以看看:Java Socket應用程式---通訊是這樣練成的