一、UDP編程 1.DatagramPacket特性以及構造方法 UDP是一個面向無連接的協議,因此,在通信時發送端和接收端不用建立連接。 Datagram類就相當於一個集裝箱用於封裝UDP通信中發送或者接收的數據。 構造方法: (1)DatagramPacket(byte[] buf,int le ...
一、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 = 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 = 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大數據學習視頻禮包