Android 基于UDP協(xié)議的Socket通信

2023-03-31 14:17 更新

本節(jié)引言:

本節(jié)給大家?guī)鞸ocket的最后一節(jié):基于UDP協(xié)議的Socket通信,在第一節(jié)中我們已經(jīng)詳細地 比較了兩者的區(qū)別,TCP和UDP最大的區(qū)別在于是否需要客戶端與服務(wù)端建立連接后才能進行 數(shù)據(jù)傳輸,如果你學(xué)了前兩節(jié)TCP的,傳輸前先開服務(wù)端,accept,等客戶端接入,然后獲得 客戶端socket然后進行IO操作,而UDP則不用,UDP以數(shù)據(jù)報作為數(shù)據(jù)的傳輸載體,在進行傳輸時 首先要把傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(Datagram),在數(shù)據(jù)報中指明數(shù)據(jù)要到達的Socket(主機地址 和端口號),然后再將數(shù)據(jù)以數(shù)據(jù)報的形式發(fā)送出去,然后就沒有然后了,服務(wù)端收不收到我就 不知道了,除非服務(wù)端收到后又給我回一段確認的數(shù)據(jù)報~時間關(guān)系就不另外寫Android例子了 直接上Java代碼~


1.服務(wù)端實現(xiàn)步驟:

Step 1:創(chuàng)建DatagramSocket,指定端口號
Step 2:創(chuàng)建DatagramPacket
Step 3:接收客戶端發(fā)送的數(shù)據(jù)信息
Step 4:讀取數(shù)據(jù)

示例代碼

public class UPDServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客戶端發(fā)送的數(shù)據(jù)
         */
        // 1.創(chuàng)建服務(wù)器端DatagramSocket,指定端口
        DatagramSocket socket = new DatagramSocket(12345);
        // 2.創(chuàng)建數(shù)據(jù)報,用于接收客戶端發(fā)送的數(shù)據(jù)
        byte[] data = new byte[1024];// 創(chuàng)建字節(jié)數(shù)組,指定接收的數(shù)據(jù)包的大小
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // 3.接收客戶端發(fā)送的數(shù)據(jù)
        System.out.println("****服務(wù)器端已經(jīng)啟動,等待客戶端發(fā)送數(shù)據(jù)");
        socket.receive(packet);// 此方法在接收到數(shù)據(jù)報之前會一直阻塞
        // 4.讀取數(shù)據(jù)
        String info = new String(data, 0, packet.getLength());
        System.out.println("我是服務(wù)器,客戶端說:" + info);

        /*
         * 向客戶端響應(yīng)數(shù)據(jù)
         */
        // 1.定義客戶端的地址、端口號、數(shù)據(jù)
        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        byte[] data2 = "歡迎您!".getBytes();
        // 2.創(chuàng)建數(shù)據(jù)報,包含響應(yīng)的數(shù)據(jù)信息
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
        // 3.響應(yīng)客戶端
        socket.send(packet2);
        // 4.關(guān)閉資源
        socket.close();
    }
}

2.客戶端實現(xiàn)步驟:

Step 1:定義發(fā)送信息
Step 2:創(chuàng)建DatagramPacket,包含將要發(fā)送的信息
Step 3:創(chuàng)建DatagramSocket
Step 4:發(fā)送數(shù)據(jù)

public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服務(wù)器端發(fā)送數(shù)據(jù)
         */
        // 1.定義服務(wù)器的地址、端口號、數(shù)據(jù)
        InetAddress address = InetAddress.getByName("localhost");
        int port = 8800;
        byte[] data = "用戶名:admin;密碼:123".getBytes();
        // 2.創(chuàng)建數(shù)據(jù)報,包含發(fā)送的數(shù)據(jù)信息
        DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
        // 3.創(chuàng)建DatagramSocket對象
        DatagramSocket socket = new DatagramSocket();
        // 4.向服務(wù)器端發(fā)送數(shù)據(jù)報
        socket.send(packet);

        /*
         * 接收服務(wù)器端響應(yīng)的數(shù)據(jù)
         */
        // 1.創(chuàng)建數(shù)據(jù)報,用于接收服務(wù)器端響應(yīng)的數(shù)據(jù)
        byte[] data2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
        // 2.接收服務(wù)器響應(yīng)的數(shù)據(jù)
        socket.receive(packet2);
        // 3.讀取數(shù)據(jù)
        String reply = new String(data2, 0, packet2.getLength());
        System.out.println("我是客戶端,服務(wù)器說:" + reply);
        // 4.關(guān)閉資源
        socket.close();
    }
}

本節(jié)小結(jié):

本節(jié)內(nèi)容比較簡單,無非就是將數(shù)據(jù)轉(zhuǎn)換為字節(jié),然后放到DatagramPacket(數(shù)據(jù)報包中),發(fā)送的 時候帶上接受者的IP地址和端口號,而接收時,用一個字節(jié)數(shù)組來緩存!發(fā)送的時候需要創(chuàng)建一個 DatagramSocket(端到端通信的類)對象,然后調(diào)用send方法給接受者發(fā)送數(shù)據(jù)報包~ 本節(jié)代碼來源于慕客網(wǎng)上的一個JavaSocket教程~有興趣的可以看看: Java Socket應(yīng)用---通信是這樣練成的

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號