戴老师的博客 - 网络
type: channel
link: https://tushu.info/tag/%E7%BD%91%E7%BB%9C/
items: Java单播、广播、多播(组播.html)

Java单播、广播、多播(组播.html)
type: item
date: 2026-07-09T04:37:58+00:00
description: 1. 通信方式分类在当前网络通信中，主要存在三种通信模式：单播、广播和多播（组播）。其中多播出现时间最晚，同时兼具单播和广播的优点。单播 (Unicast.html)：单台主机与单台主机之间的通信。广播 (Broadcast.html)：单台主机与网络中的所有主机通信。多播 (Multicast.html)：单台主机与选定的一组主机通信。2. 单播 (Unicast.html)单播是网络通信中最常见的模式，网络节点之间的通信就好像人们之间的对话。如果一个人对另外一个人说话，用网络术语描述即为“单播”，此时信息的接收和传递只在两个节点之间进行。2.1 单播的优点服务器能够响应客户端的请求。服务器能针对每个客户端的不同请求发送不同的响应，容易实现个性化服务。2.2 单播的缺点服务器需要针对每个客户机发送数据流。服务器总流量 = 客户机数量 × 客户机流量。在客户数量大、每个客户机流量大的流媒体应用中，服务器容易不堪重负。2.3 应用场景单播在网络中得到了广泛的应用，网络上绝大部分的数据都是以单播的形式传输的。例如：收发电子邮件、浏览网页时，必须与邮件服务器、网站服务器建立连接，此时使用的就是单播通信方式。3. 广播 (Broadcast.html)“广播”可以比喻为：一个人通过广播喇叭对在场的全体说话（不管对方是否乐意听）。换句话说，广播是一台主机对某一个网络上的所有主机发送数据报包。这个网络可能是整个网络，也可能是子网，还有可能是所有子网。广播主要分为两类：本地广播和定向广播。定向广播：将数据报包发送到本网络之外的特定网络的所有主机。由于互联网上的大部分路由器都不转发定向广播消息，此处不再深入介绍。本地广播：将数据报包发送到本地网络的所有主机。IPv4 的本地广播地址为 255.255.255.255，路由器不会转发此广播。3.1 广播的优点通信效率高，信息可以一次性传递到某一个网络上的所有主机。服务器不用向每个客户端单独发送数据，因此服务器负载较低。3.2 广播的缺点非常占用网络带宽。缺乏针对性，不管主机是否真的需要接收该数据，都会强制接收。3.3 应用场景有线电视就是典型的广播型网络。Java 广播示例：客户端发送程序// 发送端程序 public class BroadcastTest { public static void main(String[] args.html) { // 广播的实现：由客户端发出广播，服务器端接收 String host = "255.255.255.255"; // 广播地址 int port = 9999; // 广播的目的端口 String message = "test"; // 用于发送的字符串 try { InetAddress adds = InetAddress.getByName(host.html); DatagramSocket ds = new DatagramSocket(); DatagramPacket dp = new DatagramPacket(message.getBytes(.html), message.length(), adds, port); ds.send(dp.html); ds.close(); } catch (Exception e.html) { e.printStackTrace(); } } }服务器端接收程序// 服务器端接收程序 public class BroadcastServer { public static void main(String[] args.html) { int port = 9999; // 开启监听的端口 DatagramSocket ds = null; DatagramPacket dp = null; byte[] buf = new byte[1024]; // 存储发来的消息 StringBuffer sbuf = new StringBuffer(); try { // 绑定端口 ds = new DatagramSocket(port.html); dp = new DatagramPacket(buf, buf.length); System.out.println("监听广播端口打开：".html); ds.receive(dp.html); ds.close(); int i; for (i = 0; i < 1024; i++.html) { if (buf[i] == 0.html) { break; } sbuf.append((char.html) buf[i]); } System.out.println("收到广播消息：" + sbuf.toString(.htm…