JavaSE——UDP協議網路編程(二),javaseudp

來源:互聯網
上載者:User

JavaSE——UDP協議網路編程(二),javaseudp

在 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()來擷取)和連接埠號碼。

 

 

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.