# UDP網路通信編程 - **基本介紹** 1. 類DatagramSocket和DatagramPacket實現了基於UDP協議網路程式。 2. UDP數據報通過數據報套接字DatagramSocket發送和接收,系統不保證UDP數據報一定能夠安全送到目的地,也不能確定什麼時候可以抵達。 3. ...
UDP網路通信編程
-
基本介紹
- 類DatagramSocket和DatagramPacket實現了基於UDP協議網路程式。
- UDP數據報通過數據報套接字DatagramSocket發送和接收,系統不保證UDP數據報一定能夠安全送到目的地,也不能確定什麼時候可以抵達。
- DatagramPacket對象封裝了UDP數據報,在數據報中包含了發送端的IP地址和埠號以及接收端的IP地址和埠號。
- UDP協議中每個數據報都給出了完整的地址信息,因此無須建立發送方和接送方的連接。
-
基本流程
- 核心的兩個類/對象 DatagramSocket/DatagramPacket
- 建立發送端,接收端
- 建立數據包
- 調用DatagramSocket的發送和接收方法
- 關閉DatagramSocket
-
UDP網路編程原理示意圖
-
註意事項
- 沒有明確的服務端和客戶端,演變成數據的發送端和接收端;
- 接收數據和發送數據是通過DatagramSocket對象完成的;
- 將數據封裝到DatagramPacket對象/裝包;
- 當接收到DatagramPacket對象,需要進行拆包,取出數據;
- DatagramSocket可以指定在哪個埠接收數據;
-
代碼演示
package com.hspedu.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * @author: 86199 * @date: 2023/5/17 17:49 * @description: UDP */ public class UDPReceiverA { public static void main(String[] args) throws IOException { //1. 創建一個DatagramSocket 對象,準備在9999接收數據 DatagramSocket socket = new DatagramSocket(9999); //2. 構建一個DatagramPacket對象,用來接收數據 // UDP,一個數據包最大64K byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes, bytes.length); //3. 調用接受方法,將通過網路傳輸的 DatagramPacket 對象填充到packet對象 // 註意:當有數據發送到 本機的9999埠時,就會接收到數據 // 如果沒有數據包發送到 本機的9999埠,就會阻塞等待 System.out.println("接收端A 等待接收數據……"); socket.receive(packet); int length = packet.getLength(); byte[] data = packet.getData(); String s = new String(data, 0, length); System.out.println(s); //a端作發送端 byte[] data2 = "好的,明天見".getBytes(); DatagramPacket packet1 = new DatagramPacket(data2, data2.length, InetAddress.getByName("10.15.205.153"), 9998); socket.send(packet1); //關閉資源 socket.close(); System.out.println("A端退出..."); } }
package com.hspedu.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * @author: 86199 * @date: 2023/5/17 17:50 * @description: UDP */ public class UDPSenderB { public static void main(String[] args) throws IOException { //1. 創建 DatagramSocket 對象,準備在9998埠 發送數據 DatagramSocket socket = new DatagramSocket(9998); //2. 將需要發送的數據,封裝到 DatagramPacket對象 byte[] data = "hello,明天去吃火鍋吧".getBytes(); //說明:封裝 DatagramPacket對象 data 內容位元組數組,data.length,主機(IP),埠 DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("10.15.205.153"), 9999); socket.send(packet); //B端作接收端 byte[] bytes = new byte[1024]; DatagramPacket packet1 = new DatagramPacket(bytes, bytes.length); System.out.println("接收端B 等待接收數據……"); socket.receive(packet1); int length = packet1.getLength(); byte[] data1 = packet1.getData(); String s = new String(data1, 0, length); System.out.println(s); //關閉資源 socket.close(); System.out.println("B端退出..."); } }