1. 程式人生 > 實用技巧 >UDP通訊

UDP通訊

DatagramPacket類

該類的例項物件就相當於一個集裝箱,用於封裝UDP通訊中傳送或者接收的資料。

在建立傳送端和接收端的DatagramPacket物件時,使用的構造方法有所不同,接收端的構造方法只需要接收一個位元組陣列來存放接收到的資料,而傳送端的構造方法不但要接收存放了傳送資料的位元組陣列,還需要指定傳送端IP地址和埠號。

使用該構造方法在建立DatagramPacket物件時,指定了封裝資料的位元組陣列和資料的大小,沒有指定IP地址和埠號。很明顯,這樣的物件只能用於接收端,不能用於傳送端。因為傳送端一定要明確指出資料的目的地(ip地址和埠號)而接收端不需要明確知道資料的來源,只需要接收到資料即可。

使用該構造方法在建立DatagramPacket物件時,不僅指定了封裝資料的位元組陣列和資料的大小,還指定了資料包的目標IP地址(addr)和埠號(port)。該物件通常用於傳送端,因為在傳送資料時必須指定接收端的IP地址和埠號,就好像傳送貨物的集裝箱上面必須標明接收人的地址一樣。

DatagramSocket類

類似於碼頭,使用這個類的例項物件就可以傳送和接收DatagramPacket資料包

該構造方法用於建立傳送端的DatagramSocket物件,在建立DatagramSocket物件時,並沒有指定埠號,此時,系統會分配一個沒有被其它網路程式所使用的埠號。

該構造方法既可用於建立接收端的DatagramSocket物件,又可以建立傳送端的DatagramSocket物件,在建立接收端的DatagramSocket物件時,必須要指定一個埠號,這樣就可以監聽指定的埠。

UDP網路程式

要實現UDP通訊需要建立一個傳送端程式和一個接收端程式,很明顯,在通訊時只有接收端程式先執行,才能避免因傳送端傳送的資料無法接收,而造成資料丟失。因此,首先需要來完成接收端程式的編寫。

UDP完成資料的傳送

/*
* 傳送端
 * 1,建立DatagramPacket物件,封裝資料,接收的地址和埠
 * 2,建立DatagramSocket物件
* 3,呼叫DatagramSocket中的send方法,傳送資料包
 * 4,關閉資源DatagramSocket
 
*/ public class UDPSend { public static void main(String[] args) throws IOException { //1,建立DatagramSocket物件 DatagramSocket sendSocket = new DatagramSocket(); //2,建立DatagramPacket物件,並封裝資料 //public DatagramPacket(byte[] buf, int length, InetAddress address, int port) //構造資料報包,用來將長度為 length 的包傳送到指定主機上的指定埠號。 byte[] buffer = "hello,UDP".getBytes(); DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("192.168.75.58"), 12306); //3,傳送資料 //public void send(DatagramPacket p) 從此套接字傳送資料報包 sendSocket.send(dp); //4,釋放流資源 sendSocket.close(); } }

UDP完成資料的接收

/*
 * UDP接收端
 * 
 * 1,建立DatagramSocket物件,繫結埠號(要和傳送端埠號一致)
 * 2,建立位元組陣列,接收發來的資料
 * 3,建立資料包物件DatagramPacket
 * 4,呼叫DatagramSocket物件方法receive(DatagramPacket dp)接收資料,資料放在資料包中
 * 5,拆包
      傳送的IP地址
          資料包物件DatagramPacket方法getAddress()獲取的是傳送端的IP地址物件
          返回值是InetAddress物件
      接收到的位元組個數
          資料包物件DatagramPacket方法getLength()
      傳送方的埠號
          資料包物件DatagramPacket方法getPort()傳送埠
 * 6,關閉資源
 */
public class UDPReceive {
    public static void main(String[] args) throws IOException {
        //1,建立DatagramSocket物件,並指定埠號
        DatagramSocket receiveSocket = new DatagramSocket(12306);
        //2,建立DatagramPacket物件, 建立一個空的倉庫
        byte[] buffer = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buffer, 1024);
        //3,接收資料儲存到DatagramPacket物件中
        receiveSocket.receive(dp);
        //4,獲取DatagramPacket物件的內容
        //誰發來的資料  getAddress()
        InetAddress ipAddress = dp.getAddress();
        String ip = ipAddress.getHostAddress();//獲取到了IP地址
        //發來了什麼資料  getData()
        byte[] data = dp.getData();
        //發來了多少資料 getLenth()
        int length = dp.getLength();
        //顯示收到的資料
        String dataStr = new String(data,0,length);
        System.out.println("IP地址:"+ip+ "資料是"+ dataStr);
        //5,釋放流資源
        receiveSocket.close();
    }
}