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) | 接收数据包 |
单播:一对一、多对一
单台主机与单台主机之间的通信。
要使接收端同时接收多台设备的消息,只需接收端保持运行状态,多个发送端都填写正确的接收端地址和端口即可。
发送端实现步骤
代码示例
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();}
}
}
Java UDP通信详解:单播、广播、组播相关推荐
- Java串口通信详解(转)
Java串口通信详解(转) 作者:denimcc 日期:2007-05-11 序言 说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够 ...
- 单播 广播 组播_【技术解析】关于组播概念那些你需要知道的~
点击蓝字关注我 今天,小盟带大家继续学习一下组播知识~ 一.IGMP Message 1.组成员一旦开启IGMP,会自动发送Membership Report消息到叶路由器 2.IGMPv2版本,组成 ...
- 单播 广播 组播_组播概念3
一.IGMP Message 1.组成员一旦开启IGMP,会自动发送Membership Report消息到叶路由器 2.IGMPv2版本,组成员退出组会发送leave消息,IGMPv1不会 3.也就 ...
- LWIP的RAW API UDP通信详解(stm32f103---enc28j60)
目录 LWIP LWIP简介 LWIP主要特性 ENC28J60 ENC28J60简介 ENC28J60特点 无操作系统LWIP移植 在说移植之前,先说下几个重要的函数功能和数据结构 enc28j60 ...
- 单播 广播 组播区别
一:通信方式分类 在IPv4网络中,主机可采用的通信方式有如下三种: 1.单播:单台主机与单台主机之间的数据通信 带宽端口有多少台就发多少个数据 2.广播:单台主机向网络中所有主机发送数据包的过程 发 ...
- Java串口通信详解
序言 说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱--,总之是皆大欢喜.然而开源软件或类库的 ...
- JAVA线程通信详解
目录 一.概述 二.wait/notify 机制 三.Condition 四.生产者/消费者模式 五.线程间的通信--管道 六.方法Join的使用 一.概述 线程与线程之间不是相互独立的个体,它们彼此 ...
- QT的UDP通信详解
- HCIA-RS自用笔记(9)数据转发过程、单播/多播/组播
数据转发过程(7/13,29min) 网关(Gateway) 不同网络的主机需要通讯,首先要把数据转发给网关,网关代表一条缺省路由 查看Windows主机路由表: C:\Users\Admin> ...
- Netty中发送UDP数据报、单播、组播、广播,工作中的一些记录
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol).UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据 ...
最新文章
- LeetCode-笔记-394. 字符串解码
- 医工结合之路:草木蔓发,春山可望 | 专访清华统计中心俞声
- NLP/CV模型跨界,视觉Transformer赶超CNN?
- Android获取挂载U盘的属性
- grafana_mysql安装
- 22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)
- 特斯拉:在行驶20万英里后 其电动汽车电池仍有90%容量
- 【Clickhouse】Clckhouse 视图 可以插入 但是查询不到
- python 模块路径搜索_Python模块搜索路径问题
- 亲测!Jquery2.0不支持IE8-了
- VSCode中使用vue项目ESlint验证配置
- 互联网带来的颠覆,改变了传统的营销套路
- ajaxSubmit异步提交
- RoboWare Studio入门教程(一)
- yum源配置的三种方法
- [血泪整理]为何加载EDEM和FLUENT耦合接口显示ERROR126
- 配置华为防火墙接口IP地址和区域
- frm mysql触发器_使用mysqlfrm恢复frm表结构的方法
- MySQL数据库的存储引擎
- 优化css性能有哪些方法?