17.4.3 使用MulticastSocket实现多点广播
DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播方式发送到数量不等的多个客户端。
若要使用多点广播时,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有主机都能收到该数据报。IP多点广播(或多点发送)实现了将单一信息发送到多个接收者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,当客户端需要发送、接收广播信息时,加入到该组即可。
IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255。 多点广播的示意图如图17.7所示:
|
(点击查看大图)图17.7 多点广播的示意图 |
从图17.7中可以看出,通过Java实现多点广播时,MulticastSocket类是实现这一功能的关键,当MulticastSocket把一个DatagramPacket发送到多点广播IP地址,该数据报将被自动广播到加入该地址的所有MulticastSocket。MulticastSocket类既可以将数据报发送到多点广播地址,也可以接收其他主机的广播信息。
MulticastSocket有点像DatagramSocket,事实上MulticastSocket是DatagramSocket的一个子类,也就是说MulticastSocket是特殊的DatagramSocket。若要发送一个数据报时,可使用随机端口创建MulticastSocket,也可以在指定端口来创建MulticastSocket。
MulticastSocket提供了如下三个构造器:
public MulticastSocket():使用本机默认地址、随机端口来创建一个MulticastSocket对象。
public MulticastSocket(int portNumber):使用本机默认地址、指定端口来创建一个MulticastSocket对象。
public MulticastSocket(SocketAddress bindaddr):使用本机指定IP地址、指定端口来创建一个MulticastSocket对象。
创建一个MulticastSocket对象后,还需要将该MulticastSocket加入到指定的多点广播地址,MulticastSocket使用jionGroup()方法来加入指定组;使用leaveGroup()方法脱离一个组。
joinGroup(InetAddress multicastAddr):将该MulticastSocket加入指定的多点广播地址。
leaveGroup(InetAddress multicastAddr):让该MulticastSocket离开指定的多点广播地址。
在某些系统中,可能有多个网络接口。这可能会对多点广播带来问题,这时候程序需要在一个指定的网络接口上监听,通过调用setInterface可选择MulticastSocket所使用的网络接口;也可以使用getInterface方法查询MulticastSocket监听的网络接口。
如果创建仅用于发送数据报的MulticastSocket对象,则使用默认地址、随机端口即可。但如果创建接收用的MulticastSocket对象,则该MulticastSocket对象必须具有指定端口,否则发送方无法确定发送数据报的目标端口。
MulticastSocket用于发送、接收数据报的方法与DatagramSocket的完全一样。但MulticastSocket比DatagramSocket多一个setTimeToLive(int ttl)方法,该ttl参数设置数据报最多可以跨过多少个网络,当ttl为0时,指定数据报应停留在本地主机;当ttl的值为1时,指定数据报发送到本地局域网;当ttl的值为32时,意味着只能发送到本站点的网络上;当ttl为64时,意味着数据报应保留在本地区;当ttl的值为128时,意味着数据报应保留在本大洲;当ttl为255时,意味着数据报可发送到所有地方;默认情况下,该ttl的值为1。
从图17.7中可以看出,使用MulticastSocket进行多点广播时所有通信实体都是平等的,它们都将自己的数据报发送到多点广播IP地址,并使用MulticastSocket接收其他人发送的广播数据报。下面程序使用MulticastSocket实现了一个基于广播的多人聊天室,程序只需要一个MulticastSocket,两条线程,其中MulticastSocket既用于发送,也用于接收,其中一条线程分别负责接受用户键盘输入,并向MulticastSocket发送数据,另一条线程则负责从MulticastSocket中读取数据。
程序清单:codes/17/17-4/MulticastSocketTest.java
//让该类实现Runnable接口,该类的实例可作为线程的target
public class MulticastSocketTest implements Runnable
{
//使用常量作为本程序的多点广播IP地址
private static final String BROADCAST_IP
= "230.0.0.1";
//使用常量作为本程序的多点广播目的的端口
public static final int BROADCAST_PORT = 30000;
//定义每个数据报的最大大小为4K
private static final int DATA_LEN = 4096;
//定义本程序的MulticastSocket实例
private MulticastSocket socket = null;
private InetAddress broadcastAddress = null;
private Scanner scan = null;
//定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
//以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket =
new DatagramPacket(inBuff , inBuff.length);
//定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket = null;
public void init()throws IOException
{
try
{
//创建用于发送、接收数据的MulticastSocket对象
//因为该MulticastSocket对象需要接收,所以有指定端口
socket = new MulticastSocket(BROADCAST_PORT);
broadcastAddress = InetAddress.getByName(BROADCAST_IP);
//将该socket加入指定的多点广播地址
socket.joinGroup(broadcastAddress);
//设置本MulticastSocket发送的数据报被回送到自身
socket.setLoopbackMode(false);
//初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[0] , 0 ,
broadcastAddress , BROADCAST_PORT);
//启动以本实例的run()方法作为线程体的线程
new Thread(this).start();
//创建键盘输入流
scan = new Scanner(System.in);
//不断读取键盘输入
while(scan.hasNextLine())
{
//将键盘输入的一行字符串转换字节数组
byte[] buff = scan.nextLine().getBytes();
//设置发送用的DatagramPacket里的字节数据
outPacket.setData(buff);
//发送数据报
socket.send(outPacket);
}
}
finally
{
socket.close();
}
}
public void run()
{
try
{
while(true)
{
//读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。
socket.receive(inPacket);
//打印输出从socket中读取的内容
System.out.println("聊天信息:" + new String(inBuff , 0 ,
inPacket.getLength()));
}
}
//捕捉异常
catch (IOException ex)
{
ex.printStackTrace();
try
{
if (socket != null)
{
//让该Socket离开该多点IP广播地址
socket.leaveGroup(broadcastAddress);
//关闭该Socket对象
socket.close();
}
System.exit(1);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
throws IOException
{
new MulticastSocketTest().init();
}
}
|
上面程序中init()方法里的前三行粗体字代码先创建了一个MulticastSocket对象,由于需要使用该对象接收数据报,所以为该Socket对象设置使用固定端口。第二行粗体字代码将该Socket对象添加到指定的多点广播IP地址,第三行粗体字代码设置该Socket发送的数据报会被回送到自身(即该Socket可以接受到自己发送的数据报)。至于程序中使用MulticastSocket发送、接收数据报的代码与使用DatagramSocket并没有区别,故此处不再赘述。
分享到:
相关推荐
-java 使用 MulticastSocket 实现多点广播 MulticastSocket 是 Java 中用于实现多点广播的类,它允许开发者将数据报发送到多个客户端。与 DatagramSocket 不同,MulticastSocket 可以将数据报以广播方式发送到数量...
Android 使用 MulticastSocket 实现多点广播图片 Android 多点广播是指在同一个网络中的多个设备之间传输数据的一种技术。其中,MulticastSocket 是 Java 提供的一种多点广播机制,可以实现多个客户端之间的数据...
在Java的网络编程中,`MulticastSocket`类是一个非常重要的工具,它允许我们实现多点广播(Multicast)通信。多点广播是一种高效的网络通信方式,尤其在处理多个接收者时,它允许一个发送者将数据包一次性广播到一组...
接着,可以使用MulticastSocket发送数据报到多点广播地址,或者从多点广播地址接收数据报。MulticastSocket可以设置ttl值,以控制数据报的传输范围。 下面是使用MulticastSocket实现基于广播的多人聊天室的步骤: ...
Java中的MulticastSocket类是实现多点广播(Multicast)通信的关键工具,它允许数据报以广播形式发送到多个客户端,极大地增强了网络通信的效率。多点广播在分布式系统、实时流媒体、在线会议等场景中有着广泛的应用...
文件"(转)使用MulticastSocket实现多点广播 - hey_sky - 博客园.mht"涉及了多点广播(Multicast)的概念,这是UDP协议的一个扩展。多点广播允许一个消息被同时发送到多个接收者,这对于构建一对多的通信场景非常有用...
总结起来,Java中的MulticastSocket类是实现多点传送的核心工具,它使得Java程序能够高效地向多个接收者广播数据,有效地解决了大规模并发通信的问题,尤其适用于实时流媒体、在线会议等场景。通过创建和配置...
描述中的“MulticastSocket编程聊天不需要服务端”意味着我们将使用`MulticastSocket`来建立一个点对多点的聊天系统,其中用户可以直接向一个多播组发送消息,所有加入该组的其他用户都能接收到这些消息。...
首先,局域网广播系统的需求分析指出,系统应具备多点广播的能力,即能够向多个等待接收信息的设备发送内容。此系统以Java的组播技术为基础,设计了一个定时广播指定内容的平台。这一设计的潜力广泛,可应用于广播站...
此外,还涉及了网络组播通信,利用MulticastSocket进行多点广播。 最后一部分介绍了线程同步,这是并发编程的重要概念。Java提供了多线程支持,包括线程类和接口,线程状态管理,优先级设定,以及避免数据竞争的...
总的来说,Java组播提供了一种有效、高效的网络通信机制,通过`MulticastSocket`类,开发者可以轻松实现多点广播的应用。在给定的源码中,我们能看到如何建立组播发送者和接收者的实例,以及它们如何交互和处理数据...
在Java中,可以通过使用`java.net.MulticastSocket`类来实现组播功能。该类提供了连接和离开组播组的操作,从而支持组播数据的发送和接收。 以下是一个简单的示例,展示了如何使用`MulticastSocket`类创建一个组播...
MulticastSocket 的使用可以实现高效的组播通信,控制网络流量,减少服务器和 CPU 负载。 在编程中,首先需要创建并初始化 MulticastSocket 对象,加入指定组播组,设置 TTL 值参数等。然后启动接收线程,等待接收...
因此,组播通信的效率非常高,尤其适合于数据广播和多点通信的场合。 在实际应用中,组播通信可能会遇到一些问题,比如“最后一公里问题”,即数据包需要从核心网络传递到接收者的本地网络。此外,组播需要路由器...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...
1. 组播监听器(MulticastSocket):在Android中,使用`java.net.MulticastSocket`类创建组播监听器,用于接收组播数据。首先,需要开启一个MulticastSocket,然后通过`joinGroup()`方法加入指定的组播组。 ```java...
1. **创建MulticastSocket**:首先,我们需要创建一个`MulticastSocket`对象,这是所有组播操作的基础。可以通过调用无参数的`MulticastSocket()`构造函数来创建。 ```java MulticastSocket socket = new ...
1. **组播地址与组播端口**:组播使用特定的IP地址范围(192.168.127.12到172.16.58.3),每个组播地址代表一个组。在群聊中,服务器会广播消息到特定的组播地址,所有加入这个组的客户端都能接收到。同时,每个通信...