Java UDP通信详解:单播、广播、组播
UDP協議介紹
1.UDP是一種無連接、不可靠傳輸的協議;
2.將數據源IP、目的地IP和端口封裝成數據包,不需要建立連接 ;
3.每個數據包的大小限制在64KB內;
4.發送不管對方是否準備好,接收方收到也不確認,故是不可靠的;
5.可以廣播發送 ,發送數據結束時無需釋放資源,開銷小,速度快;
UDP協議通信場景
語音通話,視頻會話等。
UDP協議通信模型演示
數據包對象、數據包
DatagramPacket:數據包對象
構造器
常用方法
DatagramSocket:發送端和接收端對象
構造器
| public DatagramSocket()? | 創建發送端的Socket對象,系統會隨機分配一個端口號 |
| public DatagramSocket(int port) | 創建接收端的Socket對象并指定端口號 |
常用方法
| public void send(DatagramPacket dp) | 發送數據包 |
| public void receive(DatagramPacket p) | 接收數據包 |
單播:一對一、多對一
單臺主機與單臺主機之間的通信。
要使接收端同時接收多臺設備的消息,只需接收端保持運行狀態,多個發送端都填寫正確的接收端地址和端口即可。
發送端實現步驟
代碼示例
接收端實現步驟
代碼示例
廣播:一對多通訊
當前主機與所在網絡中的所有主機通信。
UDP如何實現廣播
使用廣播地址:255.255.255.255
具體操作
1.發送端發送的數據包的目的地寫的是廣播地址、且指定端口;
2.本機所在網段的其他主機的程序只要注冊對應端口即可;
發送端代碼示例
public class client {public static void main(String[] args) throws Exception {System.out.println("=====發送端啟動======");// 1、創建發送端對象:發送端自帶默認的端口號DatagramSocket socket=new DatagramSocket();// 2、創建一個數據包對象封裝數據byte[] buffer="UDP廣播測試".getBytes(); 只要目的地IP是 255.255.255.255 這個消息將以廣播的形式對外發送DatagramPacket packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("255.255.255.255"),9999);// 3、發送數據出去socket.send(packet);socket.close();} }接收端代碼示例
public class serve {public static void main(String[] args) throws Exception {System.out.println("=====接收端啟動======");// 1.創建一個接受端對象,注冊端口DatagramSocket socket=new DatagramSocket(9999);// 2.創建一個數據包對象,封裝接受的數據byte[] buffer=new byte[1024*64];DatagramPacket packet=new DatagramPacket(buffer,buffer.length);//3.等待接收消息socket.receive(packet);//4.打印接收的內容int len=packet.getLength();String rs=new String(buffer,0,len);System.out.println("收到了IP為:"+packet.getAddress()+"\n端口為:"+packet.getPort()+" 的消息");System.out.println("消息內容:"+rs);socket.close();} }組播:一對多通訊
當前主機與選定的一組主機的通信。
UDP如何實現組播
使用組播地址:224.0.0.0(不含) ~ 239.255.255.255(含)。
具體操作
1.發送端的數據包的目的地是組播IP (例如:224.0.1.1, 端口:9999);
2.接收端必須綁定該組播IP(224.0.1.1),端口還要注冊發送端的目的端口9999 ,這樣即可接收該組播消息;
3.DatagramSocket的子類MulticastSocket可以在接收端綁定組播IP;
所在網段的其他主機注冊了該組播IP和對應端口即可接收消息
發送端代碼示例
public class client {public static void main(String[] args) throws Exception {System.out.println("=====發送端啟動======");// 1、創建發送端對象:發送端自帶默認的端口號DatagramSocket socket=new DatagramSocket();// 2、創建一個數據包對象封裝數據byte[] buffer="123".getBytes();DatagramPacket packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("224.0.1.1"),9999);// 3、發送數據出去socket.send(packet);socket.close();} }接收端代碼示例
public class serve {public static void main(String[] args) throws Exception {System.out.println("=====接收端啟動======");// 1.創建一個接受端對象,注冊端口MulticastSocket socket=new MulticastSocket(9999);//把當前接收端加入到一個組播中,綁定對應的組播消息IP // socket.joinGroup(InetAddress.getByName("224.0.1.1"));//新綁定方法socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1"),9999), NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));// 2.創建一個數據包對象,封裝接受的數據byte[] buffer=new byte[1024*64];DatagramPacket packet=new DatagramPacket(buffer,buffer.length);//3.等待接收消息socket.receive(packet);//4.打印接收的內容int len=packet.getLength();String rs=new String(buffer,0,len);System.out.println("收到了IP為:"+packet.getAddress()+"\n端口為:"+packet.getPort()+" 的消息");System.out.println("消息內容:"+rs);socket.close();} } }總結
以上是生活随笔為你收集整理的Java UDP通信详解:单播、广播、组播的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作382-vant弹框不能直接用
- 下一篇: java美元兑换,(Java实现) 美元