天天看點

Java網絡程式設計-Socket程式設計初涉七(UDP協定,簡易提供-搜尋服務)

推薦:​​Java網絡程式設計彙總​​

Java網絡程式設計-Socket程式設計初涉七(UDP協定,簡易提供-搜尋服務)

提供端

提供端作為接收資訊的一方,需要指定一個端口用于資料接收;等搜尋端把請求發送過來時,提供端接收請求資訊,并且列印請求資訊,再簡單的回送一條資訊即可。

package udp.search;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Provider {
    public static void main(String[] args) throws IOException {
        System.out.println("Provider Started...");

        // 作為接收者,指定一個端口用于資料接收
        DatagramSocket ds = new DatagramSocket(2000);

        // 建構接收實體
        final byte[] buf = new byte[512];
        DatagramPacket receivePack = new DatagramPacket(buf , buf.length);

        // 接收
        ds.receive(receivePack);

        // 列印接收到的資訊與發送者的資訊
        // 發送者的IP位址
        String ip = receivePack.getAddress().getHostAddress();
        // 發送者的端口
        int port = receivePack.getPort();
        int dataLen = receivePack.getLength();
        String data = new String(receivePack.getData() , 0 ,dataLen);
        System.out.println("Provider receive form ip:"+ip+" port:"+port+" data:"+data);

        // 建構一份回送資料
        String responseData = "Receive data with len:" + dataLen;
        byte[] responseDataBytes = responseData.getBytes();
        // 直接根據發送者建構一份回送資料
        DatagramPacket responsePacket = new DatagramPacket(responseDataBytes ,
                responseDataBytes.length,
                receivePack.getAddress(),
                receivePack.getPort());

        // 發送資訊
        ds.send(responsePacket);

        // 關閉
        System.out.println("Provider Finished...");
        ds.close();
    }
}      

搜尋端

搜尋端作為搜尋方,即請求資源的一方,無需指定端口,讓系統配置設定即可;搜尋端發送請求給提供端(需要指定提供端的IP與端口),提供端接收請求後會回送資訊,搜尋端接收提供端的回送,再列印該回送即可。

package udp.search;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Searcher {
    public static void main(String[] args) throws IOException {
        System.out.println("Searcher Started...");

        // 作為搜尋方,無需指定端口,讓系統配置設定
        DatagramSocket ds = new DatagramSocket();

        // 建構一份請求資料
        String requestData = "Hello World";
        byte[] requestDataBytes = requestData.getBytes();
        // 直接建構packet
        DatagramPacket requestPacket = new DatagramPacket(requestDataBytes ,
                requestDataBytes.length);
        // 本地位址
        requestPacket.setAddress(InetAddress.getLocalHost());
        // 端口2000
        requestPacket.setPort(2000);

        // 發送資訊
        ds.send(requestPacket);

        // 建構接收實體
        final byte[] buf = new byte[512];
        DatagramPacket receivePack = new DatagramPacket(buf , buf.length);

        // 接收
        ds.receive(receivePack);

        // 列印接收到的資訊與發送者的資訊
        // 發送者的IP位址
        String ip = receivePack.getAddress().getHostAddress();
        // 發送者的端口
        int port = receivePack.getPort();
        int dataLen = receivePack.getLength();
        String data = new String(receivePack.getData() , 0 ,dataLen);
        System.out.println("Searcher receive form ip:"+ip+" port:"+port+" data:"+data);

        // 關閉
        System.out.println("Searcher Finished...");
        ds.close();
    }
}      

測試

先啟動提供端,再啟動搜尋端,不然提供端接收不到資訊。

提供端輸出:

Provider Started...
Provider receive form ip:192.168.43.214 port:49164 data:Hello World
Provider Finished...      
Searcher Started...
Searcher receive form ip:192.168.43.214 port:2000 data:Receive data with len:11
Searcher Finished...