一、UDP編程
1.DatagramPacket特性以及構造方法
- UDP是一個面向無連接的協議,因此,在通信時發送端和接收端不用建立連接,
- Datagram類就相當于一個集裝箱用于封裝UDP通信中發送或者接收的資料,
- 構造方法:
(1)DatagramPacket(byte[] buf,int length)
使用該構造方法在創建DatagramPacket物件的時候指定了封裝物件的位元組陣列和資料大小,沒有指定IP和埠號,這樣的物件只能用于接收端而不能用于發送端,因為發送端一定要明確指出資料的目的地(IP地址和埠號),而接收端不需要明確資料的來源,只需要接收到資料即可,
(2)DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
使用該構造方法在創建物件的時候指定了IP地址和埠號,通常用于發送端,
(3)DatagramPacket(byte[] buf,int offset,int length)
用于接收端,offset該引數用于指定接收到的資料放在buf緩沖陣列時是從offset開始的,
(4)DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port)
結合(2)(3)就能看懂了
2.DatagramPacket常用方法
(1)InetAddress getAddress()
回傳發送端或者接收端的IP地址,得看在哪一端,
(2)int getPort()
回傳發送端或者接收端的埠號,
(3)bytep[] getData()
回傳將要接識訓者發送的資料,
(4)int getLength()
回傳將要接識訓者發送的資料的長度,
二、DatagramSocket
- DatagramPacket就是資料包,DatagramSocket可以認為是運送資料包的“碼頭”
1.構造方法詳解
(1)DatagramSocket()
該構造方法用于創建發送端的DatagramSocket物件,沒有指定埠,系統會自動分配一個,
(2)DatagramSocket(int port)
既可以用于發送端又可以用于接收端,在用于接收端的時候必須指定埠號,這樣才能監聽埠,
(3)DatagramSocket(int port,InetAddress addr)
該物件適用于計算機上有多塊網卡的情形,使用時可以明確規定資料通過哪塊網卡向外發送和接收
哪塊網卡的資料,由于計算機中針對不同的網卡分配不同的IP地址,因此在創建物件的時候需要指定IP地址,
2.常用的成員方法
(1)void receive(DatagramPacket p)
將接受到的資料填充到DatagramPacket資料包中,在接收到資料之前會一直處于阻塞狀態,只有當接收到資料包的時,該方法才會回傳,
(2)void send(DatagramPacket p)
放送DatagramPacket資料包,發送的資料包中包含將要發送的資料,資料的長度,遠程主機的IP地址和埠號,
(3)void close
關閉當前的Socket,通知驅動程式釋放為這個Socket保留的資源,
3.直接舉例UDP編程實體
package com.bjpowernode.java_learning; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class D128_1_ServerTest { public static void main(String[] args) { DatagramSocket socket = null; DatagramPacket packet_send = null; DatagramPacket packet_receive = null; int port = 5151; //服務器監聽埠號 try { socket = new DatagramSocket(port); //創建連接物件 System.out.println("服務器啟動"); byte[] r = new byte[1024]; //創建快取陣列 packet_receive = new DatagramPacket(r,r.length);//創建資料包物件 socket.receive(packet_receive); //接收資料包 InetAddress client_ip = packet_receive.getAddress();//客戶端地址 int client_port = packet_receive.getPort(); //客戶端的埠號 byte[] data = https://www.cnblogs.com/ruigege0000/p/packet_receive.getData(); //客戶端位元組資料 int len = packet_receive.getLength(); //資料有效長度 String str1 = new String(data,0,len); //將位元組資料轉換為字串 System.out.println("客戶機"+client_ip+":"+client_port+"\n發送的資訊是:"+str1); String response = "Hello,I am Server B"; byte[] s = response.getBytes(); packet_send = new DatagramPacket(s,s.length,client_ip,client_port);//創建回應資料包物件 socket.send(packet_send); }catch(Exception e) { System.out.println(e); }finally { socket.close(); } } }
- 我們先運行這個服務器端

package com.bjpowernode.java_learning; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class D128_2_ClientTest { public static void main(String[] args) { DatagramSocket socket = null; DatagramPacket packet_send = null; DatagramPacket packet_receive = null; String server = "127.0.0.1"; //服務器IP地址 int port = 5151; //服務器埠號 String str = "Hello,I am Client A"; byte[] data = https://www.cnblogs.com/ruigege0000/p/str.getBytes(); //將要發送的資訊轉換為位元組陣列 try { socket = new DatagramSocket(); //創建連接socket物件 InetAddress addr = InetAddress.getByName(server); //將服務器端的IP地址封裝成InetAddress物件 packet_send = new DatagramPacket(data,data.length,addr,port);//創建資料包物件 socket.send(packet_send); //向服務器發送資料 byte[] r = new byte[1024]; //設定緩沖區 packet_receive = new DatagramPacket(data,data.length,addr,port);//創建資料包物件 socket.receive(packet_receive); //接收資料包 byte[] response = packet_receive.getData(); //讀取資料包中的資料資訊 int len = packet_receive.getLength(); //讀取資料長度 String str1 = new String(response,0,len); //將位元組資料轉換成字串 System.out.println("服務器回應的資訊是:"+str1); }catch(Exception e) { System.out.println(e); }finally { socket.close(); } } }
- 接下里運行客戶端程式

三、原始碼:
- D128_1_ServerTest.java
- D128_2_ClientTest.java
- https://github.com/ruigege66/Java/blob/master/D128_1_ServerTest.java
- https://github.com/ruigege66/Java/blob/master/D128_2_ClientTest.java
- CSDN:https://blog.csdn.net/weixin_44630050
- 博客園:https://www.cnblogs.com/ruigege0000/
- 歡迎關注微信公眾號:傅里葉變換,個人賬號,僅用于技術交流,后臺回復“禮包”獲取Java大資料學習視頻禮包

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