java中的網絡通信編程之UDP篇

上篇文章我們詳細說了TCP的具體用法以及它和UDP的區別,這次我們說說UDP中java網絡編程中的實際應用。

UDP編程

UDP的英文User Datagram Protocol,中文意思爲用戶數據報協議。UDP協議在文件傳輸過程中不需要建立專門的虛擬連接,所以這種協議對服務器壓力相對較小,不過UDP的不足在於,它屬於不可靠傳輸,但是也沒我們想象中的那麼不可靠,就像我給你發短信一樣,理論上,是存在你收不到的可能性的。

UDP編程在java中有客戶端網絡編程和服務端網絡編程兩個實現。

DatagramSocket

datagramSocket類似於TCP的網絡連接,雖說UDP不需要建立專門的虛擬連接,但是畢竟是發送和接受數據,datagramSocket能實現服務端的監聽器以及發送端的發送器角色。

DatagramPacket

datagrampacket 類似於網絡中數據傳輸的數據封裝,也就是說這個類的對象代表要傳輸的數據。在傳輸數據的時候,該類會對數據進行封裝,封裝後的對象包含目標放的ip地址,端口號以及發送的內容等。接受數據的時候也是以DatagramSocket對象的方式進行接收的,接受的數據包含發送方的ip 端口等信息,當然也包含發送過來的內容。形象點說,DatagramSocket 對象就像個快遞,郵寄快遞的時候上面有接收方的各種信息,信封裏面有內容。

總結來說,UDP在java中的編程方式要比TCP結構要簡單一些。

UDP客戶端編程涉及的步驟也是4個部分:建立連接、發送數據、接收數據和關閉連接。

1、建立連接

DatagramSocket ds = new DatagramSocket();

該客戶端連接使用系統隨機分配的一個本地計算機的未用端口號
 當然,可以通過制定連接使用的端口號來創建客戶端連接。
DatagramSocket ds = new DatagramSocket(5000);

一般在建立客戶端連接時沒有必要指定端口號碼。

2、發送數據

在發送數據時,需要將需要發送的數據內容首先轉換爲byte數組,然後將數據內容、服務器IP和服務器端口號一起構造成一個DatagramPacket類型的對象,這樣數據的準備就完成了了,發送時調用網絡連接對象中的send方法發送該對象即可

String host = "127.0.0.1";  
    int port = 10001;  
   //將發送的內容轉換爲byte數組  
    byte[] b = s.getBytes();  
    //將服務器IP轉換爲InetAddress對象  
    InetAddress server = InetAddress.getByName(host);  
    //構造發送的數據包對象  
    DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port);  
    //發送數據  
    ds.send(sendDp);</span>  


在發送數據之前,我們必須對要發送的數據進行封裝。
3、服務端接受數據

首先構造一個數據緩衝數組,該數組用於存儲接收的服務器端反饋數據,該數組的長度必須大於或等於服務器端反饋的實際有效數據的長度。然後以該緩衝數組爲基礎構造一個DatagramPacket數據包對象,最後調用連接對象的receive方法接收數據即可。接收到的服務器端反饋數據存儲在DatagramPacket類型的對象內部

byte[] data = new byte[1024];  
    //構造數據包對象  
    DatagramPacket receiveDp = new DatagramPacket(data,data.length);  
    //接收數據  
    ds.receive(receiveDp);  
    //輸出數據內容  
    byte[] b = receiveDp.getData(); //獲得緩衝數組  
    int len = receiveDp.getLength(); //獲得有效數據長度  
    String s = new String(b,0,len);  
    System.out.println(s);</span>  


首先構造緩衝數組data,這裏設置的長度1024是預估的接收到的數據長度,要求該長度必須大於或等於接收到的數據長度,然後以該緩衝數組爲基礎,構造數據包對象,使用連接對象ds的receive方法接收反饋數據,由於在Java語言中,除String以外的其它對象都是按照地址傳遞,所以在receive方法內部可以改變數據包對象receiveDp的內容,這裏的receiveDp的功能和返回值類似。數據接收到以後,只需要從數據包對象中讀取出來就可以了,使用DatagramPacket對象中的getData方法可以獲得數據包對象的緩衝區數組,但是緩衝區數組的長度一般大於有效數據的長度,換句話說,也就是緩衝區數組中只有一部分數據是反饋數據,所以需要使用DatagramPacket對象中的getLength方法獲得有效數據的長度,則有效數據就是緩衝數組中的前有效數據長度個內容,這些纔是真正的服務器端反饋的數據的內容
4、關閉連接

 ds.close();

UDP方式服務器端網絡編程

1、首先UDP方式服務器端網絡編程需要建立一個連接,該連接監聽某個端口:
 DatagramSocket ds = new DatagramSocket(10010);
由於服務器端的端口需要固定,所以一般在建立服務器端連接時,都指定端口號
2、接收客戶端發送過來的數據
其接收的方法和客戶端接收的方法一直,其中receive方法的作用類似於TCP方式中accept方法的作用,該方法也是一個阻塞方法,其作用是接收數據。
ds.receive()
接收到客戶端發送過來的數據以後,服務器端對該數據進行邏輯處理,然後將處理以後的結果再發送給客戶端,在這裏發送時就比客戶端要麻煩一些,因爲服務器端需要獲得客戶端的IP和客戶端使用的端口號,這個都可以從接收到的數據包中獲得。示例代碼如下:

     //獲得客戶端的IP
     InetAddress clientIP = receiveDp.getAddress();
     //獲得客戶端的端口號
     Int clientPort = receiveDp.getPort();


3、關閉連接
ds.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章