實作一個簡單的UDP通信程式,僅作為筆記使用
網路編程中有三要素:IP、埠號和通信協議,分別用來確定對方在互聯網上的地址、指定接受資料的軟體和確定資料在網路中傳輸的規則,
IP地址
IP地址分為IPv4地址和IPv6地址,這里不做討論,
IPv4地址中分為公網地址(萬維網使用)和私有地址(局域網使用),192.168.開頭的就是私有地址,范圍是192.168.0.0--192.168.255.255,另外還有一個特殊地址:127.0.0.1,也可以是localhost,稱為回送地址,也稱本機IP,與在局域網中被分配的IPv4地址來說,該地址永遠指向自身,而分配的IP地址,有可能隨著連接時間和地點的變換而變換,
埠號
埠號是應用程式在設備中唯一的標識,有兩個位元組標識的整陣列成,因此取值范圍為065535,其中01023之間的埠固定用于一些知名的網路服務或者應用,一個埠號只能被一個應用占用,
協議
互聯網通信協議分為OSI參考模型和TCP/IP參考模型,這里不做討論,
兩種運行在傳輸層的協議:
- UDP協議:用戶資料包協議(User Datagram Protocol),UDP是面向無連接的通信協議,速度較快,但有大小限制,一次最多發送64k,是資料不安全的,易丟失資料,
- TCP協議:傳輸控制協議(Transmission Control Protocol),TCP協議是面向連接的通信協議,速度相較于UDP較慢,但沒有大小限制,是資料安全的,
UDP通信程式流程
發送資料
- 創建發送端的 DatagramSocket物件
- 資料打包 DatagramPacket
- 發送資料
- 釋放資源
接收資料
- 創建接收端的 DatagramSocket
- 接收打包好的資料
- 決議資料包
- 釋放資源
UDP-Sender實作
public class SendMessageDemo {
public static void main(String[] args) throws IOException {
//1. 創建發送端的 DatagramSocket,空參表示不指定埠,隨機使用可用埠
DatagramSocket socket = new DatagramSocket();
//2. 將資料封裝進 DatagramPacket 物件中,作為發送者,需要指定接收方的IP和接受埠號
String str = "Hello";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");//get target IP address
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10086);
//3. 發送打包的資料包
socket.send(packet);
//4. 埠號資源是有限的,發送完成后釋放埠號
socket.close();
}
}
UDP-Receiver實作
public class ReceiveMessageDemo {
public static void main(String[] args) throws IOException {
//1. 創建接收端的 DatagramSocket,作為接收方,需要指定使用哪個介面進行接受
DatagramSocket socket = new DatagramSocket(10086);
//2.接收打包好的資料,由于資料通過DatagramPacket物件發送,接收端也需要創建一個DatagramPacket物件來接收
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//這個方法是阻塞的,程式會一致在這里等待
socket.receive(packet);
//3. 決議資料,接收方可以得到以下資訊:發送的資料包、資料長度、發送發地址、發送方使用的埠號
byte[] data = https://www.cnblogs.com/hiibird/archive/2023/04/08/packet.getData();
int len = packet.getLength();
InetAddress address = packet.getAddress();
int port = packet.getPort();
System.out.println("Received data: " + new String(data, 0, len));
System.out.println("This data was send from " + port + "port of the " + address + " computer");
//4. 釋放資源
socket.close();
}
}
需要先運行接收端程式,接收程式阻塞等待接受資料,然后運行發送端程式,發送資料,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549498.html
標籤:其他
