1. 程式人生 > >java 簡單地udp伺服器----雲平臺開發學習筆記

java 簡單地udp伺服器----雲平臺開發學習筆記

應用: 在選擇使用協議的時候,選擇UDP必須要謹慎。在網路質量令人十分不滿意的環境下,UDP協議資料包丟失會比較嚴重。但是由於UDP的特性:它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。

java開發: java中的UDP實現分為兩個類:DatagramPacketDatagramSocket。DatagramPacket類將資料位元組填充到UDP包中,這稱為資料報。 DatagramSocket來發送這個包。要接受資料,可以從DatagramSocket

中接受一個 DatagramPack物件,然後從該包中讀取資料的內容。

下面來一一說明udp伺服器在java中的實現:

----建立資料接收碼頭,只接受和客戶端約定的1080埠的資料

        DatagramSocket ds=new DatagramSocket(1080);

----建立資料接收的資料緩衝區

       DatagramPacket request = new DatagramPacket(new byte[1024], 1024);

----接受來自埠1024的資料包,並存儲在集裝箱datagramPacket中:注意一旦伺服器開啟,就會自動監聽3000埠,如果 沒有資料,則進行阻塞

        ds.receive(dp);

----解析資料包中的資訊

       String data=new String(dp.getData(),0,dp.getLength());

----向客戶端傳送資料包

        DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
        socket.send(response);

伺服器程式碼:

public class UDPService {
    private final static int PORT = 1080    
    public static void main(String[] args) {
        try (DatagramSocket socket = new DatagramSocket(PORT)) {
            while (true) {
                try {
                    DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
                    socket.receive(request);                  //獲取傳送端dp
                    String daytime = new Date().toString();  //系統時間
                    byte[] data = daytime.getBytes("ASCII");
                    String data2=new String(request.getData(),0,request.getLength()); //拼接字串, 傳送值
                    DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
                    socket.send(response);                //傳送返回值
                    System.out.println("i get:"+daytime + " " + request.getAddress()+"data:"+data2);
                    if(data2.equals("hello"))
                        System.out.println("i'm full!!!!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客戶端程式碼:

public class UDPClient {
	public static void main(String[] args) throws Exception {

        //資料包套接字:相當於碼頭,專門處理通訊資料及進行資料轉發設定的
        DatagramSocket ds=new DatagramSocket();

        String message="hello";

        //資料報包:類似於集裝箱,用來儲存所有的資料資訊
        DatagramPacket dp=new DatagramPacket(
                message.getBytes(),   //資料都是已位元組資料進行傳送的,因此需要將資料進行轉換
                message.length(), //傳送資料的長度
                InetAddress.getByName("127.0.0.1"),  //傳送資料的源ip地址
                1080   //傳送資料的埠號
                );

        ds.send(dp);  //資料包通過碼頭DatagramSocket傳送出去
        ds.close();   //資料傳送之後關閉通道,減少資源浪費
        System.out.println("傳送成功, 等待迴應! ");
        
    }

}

測試: