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(); } }