java 单播、广播、组播详解及实例代码
发布时间 - 2026-01-10 23:02:35 点击率:次java 单播、广播、组播详解及实例代码

在当前网络通信中(TCP/IP也不例外)有三种通信模式:单播、广播、组播(又叫多播, 个人感觉叫多播描述的有点不恰当),其中多播出现的时间最晚,但同时具备单播和广播的优点,最具有发展前景。
一.通信方式分类:
1.单播:单台主机与单台主机之间的通信;
2.广播:单台主机与网络中所有主机的通信;
3.组播:单台主机与选定的一组主机的通信;
二.单播:
单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样。如果一个人对另外一个人说话,
那么用网络技术的术语来描述就是“单播”,此时信息的接收和传递只在两个节点之间进行。
1. 单播的优点:
(1)服务器以及响应客户端的请求;
(2)服务器能针对每个客户端的不同请求发送不同的响应,容易显示个性化服务;
2. 单播的缺点:
(1)服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负;
3. 应用场景:
单播在网络中得到了广泛的应用,网络上绝大部分的数据都 是以单播的形式传输的。例如:收发电子邮件、游览网页时,必须与邮件服务器、
服务器建立连接,此时使用的就是单播通信方式;
三.广播:
“广播”可以比方为:一个人通过广播喇叭对在场的全体说话(他才不管你是否乐意听)。换句话说: 广播是一台主机对某一个网络上的所有主机发送数据报包。
这个网络可能是网络,也可能时子网,还有可能是所有子网。
广播有两类:本地广播和定向广播:
定向广播:将数据报包发送到本网络之外的特定网络的所有主机,然而,由于互联网上的大部分路由器都不转发定向广播消息,所以这里不深入介绍了
本地广播:将数据报包发送到本地网络的所有主机,IPv4的本地广播地址为“255.255.255.255”,路由器不会转发此广播;
1.广播的优点:
(1)通信的效率高,信息一下子就可以传递到某一个网络上的所有主机。
(2)由于服务器不用向每个客户端单独发送数据,所以服务器流量比较负载低;
2.广播的缺点:
(1)非常占用网络的带宽;
(2)缺乏针对性,也不管主机是否真的需要接收该数据, 就强制的接收数据;
3.应用场景:
(1)有线电视就是典型的广播型网络
四.组播:
”组播“可以比方为:你对着大街喊:”是男人的来一下,一人发一百块”,那么男的过来,女就不会过来,因为没有钱发她不理你(组播:其中所有的男生就是一个组), 换句话说: 组播是一台主机向指定的一组主机发送数据报包,因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率 极低,是不可取 的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的,又会占用网络带宽。采用组播方式,既可以 实现一次传送所
有目标节点的数据,也可以达到只对特定对象传送数据的目的。
IP网络的组播一般通过组播IP地址来实现。组播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。
1.组播的优点:
(1)具备广播所具备的所有优点;
(2)与单播相比,提供了发送数据报包的效率,与广播相比,减少了网络流量;
2.组播的缺点:
(1)与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补;
五.应用实例:
1.UDP单播的例子
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
// 客户端
public class ClientTest
{
private static final int MAXRECEIVED = 255;
public static void main(String[] args) throws IOException
{
byte[] msg = new String("connect test successfully!!!").getBytes();
DatagramSocket client = new DatagramSocket();
InetAddress inetAddr = InetAddress.getLocalHost();
SocketAddress socketAddr = new InetSocketAddress(inetAddr, 8888);
DatagramPacket sendPacket = new DatagramPacket(msg, msg.length,
socketAddr);
client.send(sendPacket);
client.close();
}
}
服务端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;
//服务端
public class ServerTest
{
private static final int MAXREV = 255;
public static void main(String[] args) throws IOException
{
DatagramSocket server = new DatagramSocket(8888);
DatagramPacket recvPacket = new DatagramPacket(new byte[MAXREV], MAXREV);
while (true)
{
server.receive(recvPacket);
byte[] receiveMsg = Arrays.copyOfRange(recvPacket.getData(),
recvPacket.getOffset(),
recvPacket.getOffset() + recvPacket.getLength());
System.out.println("Handing at client "
+ recvPacket.getAddress().getHostName() + " ip "
+ recvPacket.getAddress().getHostAddress());
System.out.println("Server Receive Data:" + new String(receiveMsg));
server.send(recvPacket);
}
}
}
2.UDP广播的例子
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//客户端
public class BroadcastSender
{
public static void main(String[] args) throws IOException
{
byte[] msg = new String("connection successfully!!!").getBytes();
/*
* 在Java UDP中单播与广播的代码是相同的,要实现具有广播功能的程序只需要使用广播地址即可, 例如:这里使用了本地的广播地址
*/
InetAddress inetAddr = InetAddress.getByName("255.255.255.255");
DatagramSocket client = new DatagramSocket();
DatagramPacket sendPack = new DatagramPacket(msg, msg.length, inetAddr,
8888);
client.send(sendPack);
System.out.println("Client send msg complete");
client.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Arrays;
//服务端
public class BroadcastReceive
{
public static void main(String[] args) throws IOException
{
DatagramPacket receive = new DatagramPacket(new byte[1024], 1024);
DatagramSocket server = new DatagramSocket(8888);
System.out.println("---------------------------------");
System.out.println("Server current start......");
System.out.println("---------------------------------");
while (true)
{
server.receive(receive);
byte[] recvByte = Arrays.copyOfRange(receive.getData(), 0,
receive.getLength());
System.out.println("Server receive msg:" + new String(recvByte));
}
}
}
3.UDP组播的例子
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//客户端
public class MulticastSender
{
public static void main(String[] args) throws IOException
{
int port = 8888;
byte[] msg = "Connection successfully!!!".getBytes();
InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");
/*
* Java UDP组播应用程序主要通过MulticastSocket实例进行通信,它是DatagramSocket的是一个子类,
* 其中包含了一些额外的可以控制多播的属性.
*
* 注意:
*
* 多播数据报包实际上可以通过DatagramSocket发送,只需要简单地指定一个多播地址。
* 我们这里使用MulticastSocket,是因为它具有DatagramSocket没有的能力
*/
MulticastSocket client = new MulticastSocket();
DatagramPacket sendPack = new DatagramPacket(msg, msg.length,
inetRemoteAddr, port);
client.send(sendPack);
System.out.println("Client send msg complete");
client.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Arrays;
//服务端
public class MulticastReceive
{
public static void main(String[] args) throws IOException
{
InetAddress inetRemoteAddr = InetAddress.getByName("224.0.0.5");
DatagramPacket recvPack = new DatagramPacket(new byte[1024], 1024);
MulticastSocket server = new MulticastSocket(8888);
/*
* 如果是发送数据报包,可以不加入多播组; 如果是接收数据报包,必须加入多播组; 这里是接收数据报包,所以必须加入多播组;
*/
server.joinGroup(inetRemoteAddr);
System.out.println("---------------------------------");
System.out.println("Server current start......");
System.out.println("---------------------------------");
while (true)
{
server.receive(recvPack);
byte[] recvByte = Arrays.copyOfRange(recvPack.getData(), 0,
recvPack.getLength());
System.out.println("Server receive msg:" + new String(recvByte));
}
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# 单播、广播、组播
# 单播、广播、组播详解
# 单播、广播、组播实例详解
# java使用MulticastSocket实现多点广播
# java使用MulticastSocket实现基于广播的多人聊天室
# java使用MulticastSocket实现组播
# 组播
# 客户端
# 子网
# 服务端
# 可以通过
# 只需要
# 发送到
# 网络通信
# 方为
# 的是
# 一台主机
# 也不
# 会有
# 都不
# 子类
# 就好
# 对着
# 它是
# 也可
# 希望能
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何配置Horizon来管理队列?(安装和使用)
实例解析angularjs的filter过滤器
黑客入侵网站服务器的常见手法有哪些?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
Laravel Docker环境搭建教程_Laravel Sail使用指南
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
如何在服务器上三步完成建站并提升流量?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Swift中switch语句区间和元组模式匹配
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何在IIS中新建站点并解决端口绑定冲突?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何在建站之星绑定自定义域名?
微信公众帐号开发教程之图文消息全攻略
Android自定义listview布局实现上拉加载下拉刷新功能
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
Laravel如何自定义错误页面(404, 500)?(代码示例)
如何在云主机上快速搭建网站?
如何用景安虚拟主机手机版绑定域名建站?
如何在阿里云虚拟主机上快速搭建个人网站?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
网站图片在线制作软件,怎么在图片上做链接?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
香港服务器WordPress建站指南:SEO优化与高效部署策略
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何快速使用云服务器搭建个人网站?
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
javascript如何操作浏览器历史记录_怎样实现无刷新导航
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
高端网站建设与定制开发一站式解决方案 中企动力
Laravel如何实现本地化和多语言支持?(i18n教程)
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
非常酷的网站设计制作软件,酷培ai教育官方网站?
独立制作一个网站多少钱,建立网站需要花多少钱?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何在Windows虚拟主机上快速搭建网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?

