当前位置: 首页 > news >正文

UDP通信-广播、组播

UDP的三种通信方式

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

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

组播:当前主机与选定的一组主机的通信。

UDP如何实现广播

使用广播地址:255.255.255.255

具体操作:

发送端发送的数据包的目的地写的是广播地址、且指定端口。 (255.255.255.255  ,   9999)

本机所在网段的其他主机的程序只要注册对应端口就可以收到消息了。(9999)

代码实现:

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();// 注意:只要目的地IP是 255.255.255.255 这个消息将以广播的形式对外发送DatagramPacket packet = new DatagramPacket( buffer, buffer.length,InetAddress.getByName("255.255.255.255") , 8888);// 3、发送数据出去socket.send(packet);}}
}
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如何实现组播

使用组播地址:224.0.0.0(不含) ~ 239.255.255.255(含)

具体操作:

发送端的数据包的目的地是组播IP  (例如:224.0.1.1,  端口:9999)

接收端必须绑定该组播IP(224.0.1.1),端口还要注册发送端的目的端口9999 ,这样即可接收该组播消息。

DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP。 

代码实现:

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.getByName("224.0.1.1") , 9898);// 3、发送数据出去socket.send(packet);}}
}
public class ServerDemo3 {public static void main(String[] args) throws Exception {System.out.println("=====服务端启动======");// 1、创建接收端对象:注册端口(人)MulticastSocket socket = new MulticastSocket(9898);// 注意:绑定组播地址(加群)socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1") , 9898),NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));// 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);}}
}
http://www.lryc.cn/news/194799.html

相关文章:

  • 10-bean创建流程1一finishBeanFactoryInitialization(ConfigurableListableBeanFactory
  • 专题三:穷举、暴搜、深搜、回溯、剪枝【递归、搜索、回溯】
  • 国科云SSL证书讲堂:SSL证书安装常见问题盘点
  • Python3无法调用Sqlalchemy解决(mysqldb)
  • 2023/10/15总结
  • 关于图像分割SDK的一些基础认识
  • SpringMVC之国际化上传下载
  • TigerVNC自动设置密码脚本
  • 什么是美体SDK?美摄美颜美体SDK对接开发指南
  • 【Java集合中各种数据结构的方法汇总】
  • 算法通过村第十四关-堆|白银笔记|经典问题
  • 如何正确维护实验室超声波清洗器?
  • DID赛道前列的生物识别技术,开启Web3时代的大门—MXT
  • Java基础面试-final
  • 全波形反演的目标和技术
  • 【SA8295P 源码分析】105 - QNX MISC分区读写、切换A/B启动槽、读取开机次数命令 swdl_utils 介绍 及 祼分区读写 代码实现
  • Grade 5 Math
  • 简易的慢SQL自定义告警实战经验(支持多数据源)
  • 【Springboot】Filter 过滤器的使用
  • 力扣-461.汉明距离
  • GEE 18:基于GEE平台的土地荒漠化监测与分析【论文复现】
  • 平台系统老板驾驶舱的重要性,我选云表
  • 【SpringMVC篇】探索请求映射路径,Get请求与Post请求
  • vqvae简单实战,利用vqvae来提升模型向量表达
  • idea禁用双击ctrl
  • 记使用docker部署项目出现问题
  • EDU挖掘
  • 机器人制作开源方案 | 杠杆式6轮爬楼机器人
  • 报错——warning: ignoring JAVA_HOME=/home/jdk/jdk1.8.0_281; using bundled JDK
  • 【Java8】java.time 根据日期获取年初年末、月初月末、日初日末