UDP協議與UDP通訊


1 UDP協議

UDP是無連接通信協議,即在數據傳輸時,數據的發送端和接收端不建立邏輯連接。簡單來說,當一台計算機向另外一台計算機發送數據時,發送端不會確認接收端是否存在,就會發出數據,同樣接收端在收到數據時,也不會向發送端反饋是否收到數據。

由於使用UDP協議消耗資源小,通信效率高,所以通常都會用於音頻、視頻和普通數據的傳輸例如視頻會議都使用UDP協議,因為這種情況即使偶爾丟失一兩個數據包,也不會對接收結果產生太大影響。

但是在使用UDP協議傳送數據時,由於UDP的面向無連接性,不能保證數據的完整性,因此在傳輸重要數據時不建議使用UDP協議。

UDP傳輸數據被限制在64K以內。

2 UDP通信

2.1 DatagramPacket

JDK中提供了一個DatagramPacket類,該類的實例對象就相當於一個集裝箱,用於封裝UDP通信中發送或者接收的數據。

使用該構造方法在創建DatagramPacket對象時,不僅指定了封裝數據的字節數組和數據的大小,還指定了數據包的目標IP地址(addr)和端口號(port)。該對象通常用於發送端,因為在發送數據時必須指定接收端的IP地址和端口號,就好像發送貨物的集裝箱上面必須標明接收人的地址一樣。

DatagramPacket類中的常用方法

2.2 DatagramSocket

在程序中需要實現通信只有DatagramPacket數據包也同樣不行,為此JDK中提供的一個DatagramSocket類。DatagramSocket類的作用就類似於碼頭,使用這個類的實例對象就可以發送和接收DatagramPacket數據包

該構造方法既可用於創建接收端的DatagramSocket對象,又可以創建發送端的DatagramSocket對象,在創建接收端的DatagramSocket對象時,必須要指定一個端口號,這樣就可以監聽指定的端口。

DatagramSocket類中的常用方法

2.3 UDP網絡程序

要實現UDP通信需要創建一個發送端程序和一個接收端程序

UDP完成數據的發送:

復制代碼
//發送端 public class UDPSend { public static void main(String[] args) throws IOException { //接收用戶輸入的數據 Scanner sc=new Scanner(System.in); String str=sc.nextLine(); //1.創建數據包對象,封裝要發送的數據,接收端的ip,端口號 byte[] bytes=str.getBytes(); //創建inetAddress對象封裝接收端的地址 InetAddress inet=InetAddress.getByName("192.168.1.174"); DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6000); //2.創建DatagramSocket對象,數據包的發送對象 DatagramSocket ds=new DatagramSocket(); //3.調用ds的send方法,發送數據包  ds.send(dp); //4.釋放資源  ds.close(); } }
復制代碼

UDP完成數據的接收:

復制代碼
//接收端 public class UDPRecieve { public static void main(String[] args) throws IOException { //創建數據包傳輸對象DatagramSocket綁定端口號 DatagramSocket ds=new DatagramSocket(6000); //創建字節數組來接收發過來的數據 byte[] bytes=new byte[1024]; //創建數據包對象DatagramPacket DatagramPacket dp=new DatagramPacket(bytes, bytes.length); //調用數據包傳輸對象的receive方法來接收數據  ds.receive(dp); //拆包 //獲取數據長度 int length=dp.getLength(); //獲取ip地址 String ip=dp.getAddress().getHostAddress(); //獲取端口號 int port=dp.getPort(); System.out.println("ip地址為:"+ip+",端口號為:"+port+",發送的內容為:"+new String(bytes,0,length)); //釋放資源  ds.close(); } }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM