1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Java UDP通信详解:单播 广播 组播

Java UDP通信详解:单播 广播 组播

时间:2022-02-11 04:57:12

相关推荐

Java UDP通信详解:单播 广播 组播

UDP协议介绍

1.UDP是一种无连接、不可靠传输的协议;

2.将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 ;

3.每个数据包的大小限制在64KB内;

4.发送不管对方是否准备好,接收方收到也不确认,故是不可靠的;

5.可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快;

UDP协议通信场景

语音通话,视频会话等。

UDP协议通信模型演示

数据包对象、数据包

DatagramPacket:数据包对象

构造器

常用方法

DatagramSocket:发送端和接收端对象

构造器

常用方法

单播:一对一、多对一

单台主机与单台主机之间的通信。

要使接收端同时接收多台设备的消息,只需接收端保持运行状态,多个发送端都填写正确的接收端地址和端口即可。

发送端实现步骤

代码示例

public class ClientDemo1 {public static void main(String[] args) throws Exception {System.out.println("=====客户端启动======");// 1、创建发送端对象:发送端自带默认的端口号DatagramSocket socket = new DatagramSocket();Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();if("exit".equals(msg)){System.out.println("离线成功!");socket.close();break;}// 2、创建一个数据包对象封装数据byte[] buffer = msg.getBytes();DatagramPacket packet = new DatagramPacket( buffer, buffer.length,InetAddress.getLocalHost() , 8888);// 3、发送数据出去socket.send(packet);}socket.close();}}

接收端实现步骤

代码示例

public class ServerDemo2 {public static void main(String[] args) throws Exception {System.out.println("=====服务端启动======");// 1、创建接收端对象:注册端口DatagramSocket socket = new DatagramSocket(8888);// 2、创建一个数据包对象接收数据byte[] buffer = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true) {// 3、等待接收数据。socket.receive(packet);// 4、取出数据即可// 读取多少倒出多少int len = packet.getLength();String rs = new String(buffer,0, len);System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);}}}

广播:一对多通讯

当前主机与所在网络中的所有主机通信。

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();}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。