程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaSE——UDP協議網絡編程(二)

JavaSE——UDP協議網絡編程(二)

編輯:關於JAVA

JavaSE——UDP協議網絡編程(二)。本站提示廣大學習愛好者:(JavaSE——UDP協議網絡編程(二))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaSE——UDP協議網絡編程(二)正文


在 UDP 網絡編程中,發送方與接納方沒有樹立聯絡,沒有分明的服務器端和客戶端的區別。

  • 類 DatagramSocket:

此類表示用來發送和接納數據報包的套接字。

次要的結構辦法:

DatagramSocket():創立實例,綁定本機的默許IP地址,隨機選擇端口。通常用於客戶端編程,沒有特定監聽的端口,僅僅運用一個暫時的。 
DatagramSocket(int port):創立實例,指定端口號,即固定監聽Port端口的報文。 
DatagramSocket(int port, InetAddress localAddr):制定IP地址和端口號。當一台機器擁有多於一個IP地址的時分,由它創立的實例僅僅接納來自LocalAddr的報文。

常用辦法:

receive(DatagramPacket d):接納數據報文到d中。
send(DatagramPacket d):發送報文d到目的地。 
setSoTimeout(int timeout):設置超時時間,單位為毫秒。 
close():封閉DatagramSocket。在使用順序加入的時分,通常會自動釋放資源,封閉Socket,但是由於異常地加入能夠形成資源無法回收。所以,應該在順序完成時,自動運用此辦法封閉Socket,或在捕捉到異常拋出後封閉Sock

  • DatagramPacket:

用於處置報文,將byte數組、目的地址、目的端口等數據包裝成報文或許將報文拆卸成byte數組。 

次要結構辦法:

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):從buf數組中,取出length長的數據創立數據包對象,目的是addr地址,port端口。 
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):從buf數組中,取出offset開端的、length長的數據創立數據包對象,目的是addr地址,port端口。 
DatagramPacket(byte[] buf, int offset, int length):將數據包中從offset開端、length長的數據裝進buf數組。
DatagramPacket(byte[] buf, int length):將數據包中length長的數據裝進buf數組。

常用辦法:

getData():它從實例中獲得報文的byte數組編碼。 

  • UDP協議數據報的發送和承受

發送端:
1.樹立udpsocket服務端點。該端點樹立,零碎會隨機分配一個端口。假如不想隨機配置,可以手動指定。 DatagramSocket ds = new DatagramSocket(9999);此處制定端口為 9999,這個端口號是發送端的端口號。

2. 將數據停止packet包的封裝,必需要指定目的地址和端口。  byte[] buf = "hello,客戶端".getBytes(); DatagramPacket dp =new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.1"),9999);

3. 經過socket服務的send辦法將該包收回。 ds.send(dp);

4. 將socket服務封閉。次要是封閉資源。 ds.close();

接納端:
1. 樹立udp的socket服務。要監聽一個端口。 DatagramSocket ds = new DatagramSocket(9999);
2. 定義一個緩沖區,將該緩沖區封裝到packet包中。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length);
3. 經過socket的receive辦法將數據存入數據包中。 ds.receive(dp);receive辦法發生一個“阻塞”。
4. 經過數據包dp的辦法getData()、getAddress()、getPort()等辦法獲取包中的指定信息。
5. 封閉socket。 ds.close();

留意:1.在創立DatagramSocket類實例時,假如端口曾經被運用,會發生一個SocketException的異常拋出,並招致順序合法終止,這個異常應該留意捕捉。 

2.“阻塞”是一個專業名詞,它會發生一個外部循環,使順序暫停在這個中央,直到一個條件觸發。 

  • 零碎完成:

  • 代碼完成:

接納端:

public class Server {

    public static void main(String[] args) throws IOException {
        //綁定本機IP,指定端口號為 9999.
        DatagramSocket server = new DatagramSocket(9999);
        //預備字節數組,大小可包容1024個字節開端接納數據。
        byte[] bytes = new byte[1024];
        //將字節數組中的前1024個字節封裝進 packet 中。
        DatagramPacket packet = new DatagramPacket(bytes,1024);
        //經過socket的 receive()辦法將數據存入數據包中。
        server.receive(packet);
        //將服務器端接納到的數據打印出來,此時的數據曾經解析成了原始的數據並且是實踐接納到的長度
        String Msg = new String(packet.getData(),0,packet.getLength()); 
        System.out.println("服務器端接納到的音訊" + Msg);

    }

}

發送端:

public class Client {

    public static void main(String[] args) throws IOException {
        //綁定本機端口號,隨機選擇一個端口號
        @SuppressWarnings("resource")
        DatagramSocket client = new DatagramSocket();
        //向服務器端發送數據
        String str = "Hello,I'm client";
        //以字節方式發送
        byte[] bytes = str.getBytes();
        //將字節信息封裝在 packet 中以待發送。留意此時要取得的參數有字節數組中從0 到完畢的一切字節,接納端的IP地址和端口號。
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("127.0.0.1"),9999);
        //發送
        client.send(packet);
    }

}

output:

留意,UDP通訊進程中發段和收端不需求樹立銜接,次要經過 send()和receive()辦法來發送和承受數據,並且發送和接納的數據均以 packet 為載體,發送的時分,packet 的參數應該有接納方的 IP地址(經過InetAddress.getByName()來獲取)和端口號。

 

 

 如有不對之處,還望指正,謝謝(●'◡'●)

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved