java 簡單地udp伺服器----雲平臺開發學習筆記
應用: 在選擇使用協議的時候,選擇UDP必須要謹慎。在網路質量令人十分不滿意的環境下,UDP協議資料包丟失會比較嚴重。但是由於UDP的特性:它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。比如我們聊天用的ICQ和QQ就是使用的UDP協議。
java開發: java中的UDP實現分為兩個類:DatagramPacket和 DatagramSocket。DatagramPacket類將資料位元組填充到UDP包中,這稱為資料報。 DatagramSocket來發送這個包。要接受資料,可以從DatagramSocket
下面來一一說明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("傳送成功, 等待迴應! ");
}
}
測試: