知识大全 使用MulticastSocket实现多点广播(1)
Posted 地址
篇首语:厌伴老儒烹瓠叶,强随举子踏槐花。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用MulticastSocket实现多点广播(1)相关的知识,希望对你有一定的参考价值。
疯狂Java讲义:使用MulticastSocket实现多点广播(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
使用MulticastSocket实现多点广播
DatagramSocket只允许数据报发送给指定的目标地址 而MulticastSocket可以将数据报以广播方式发送到数量不等的多个客户端
若要使用多点广播时 则需要让一个数据报标有一组目标主机地址 当数据报发出后 整个组的所有主机都能收到该数据报 IP多点广播(或多点发送)实现了将单一信息发送到多个接收者的广播 其思想是设置一组特殊网络地址作为多点广播地址 每一个多点广播地址都被看做一个组 当客户端需要发送 接收广播信息时 加入到该组即可
IP协议为多点广播提供了这批特殊的IP地址 这些IP地址的范围是 至 多点广播的示意图如图 所示
图 多点广播的示意图
从图 中可以看出 通过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为 时 指定数据报应停留在本地主机 当ttl的值为 时 指定数据报发送到本地局域网 当ttl的值为 时 意味着只能发送到本站点的网络上 当ttl为 时 意味着数据报应保留在本地区 当ttl的值为 时 意味着数据报应保留在本大洲 当ttl为 时 意味着数据报可发送到所有地方 默认情况下 该ttl的值为
从图 中可以看出 使用MulticastSocket进行多点广播时所有通信实体都是平等的 它们都将自己的数据报发送到多点广播IP地址 并使用MulticastSocket接收其他人发送的广播数据报 下面程序使用MulticastSocket实现了一个基于广播的多人聊天室 程序只需要一个MulticastSocket 两条线程 其中MulticastSocket既用于发送 也用于接收 其中一条线程分别负责接受用户键盘输入 并向MulticastSocket发送数据 另一条线程则负责从MulticastSocket中读取数据
程序清单 codes/ / /MulticastSocketTest java
//让该类实现Runnable接口 该类的实例可作为线程的target
public class MulticastSocketTest implements Runnable
//使用常量作为本程序的多点广播IP地址
private static final String BROADCAST_IP
= ;
//使用常量作为本程序的多点广播目的的端口
public static final int BROADCAST_PORT = ;
//定义每个数据报的最大大小为 K
private static final int DATA_LEN = ;
//定义本程序的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 它包含一个长度为 的字节数组
outPacket = new DatagramPacket(new byte[ ]
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
inPacket getLength()))
//捕捉异常
catch (IOException ex)
ex printStackTrace()
try
if (socket != null)
//让该Socket离开该多点IP广播地址
socket leaveGroup(broadcastAddress)
//关闭该Socket对象
socket close()
System exit( )
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讲义
编辑推荐
Java程序性能优化 让你的Java程序更快 更稳定
新手学Java 编程
cha138/Article/program/Java/hx/201311/27258相关参考
知识大全 使用MulticastSocket实现多点广播(3)
疯狂Java讲义:使用MulticastSocket实现多点广播(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶
知识大全 使用MulticastSocket实现多点广播(4)
疯狂Java讲义:使用MulticastSocket实现多点广播(4) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶
二锅头 1公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为: (1)业务性广播系统。 (2)服务性广播系统。 (3)火灾事故广播系统。 2办
二锅头 1公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为: (1)业务性广播系统。 (2)服务性广播系统。 (3)火灾事故广播系统。 2办
1.公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为: (1)业务性广播系统。 (2)服务性广播系统。 (3)火灾事故广播系统。 2.办公楼、商业
1.公共建筑应设有线广播系统。系统的类别应根据建筑规模、使用性质和功能要求确定。有线广播一般可分为: (1)业务性广播系统。 (2)服务性广播系统。 (3)火灾事故广播系统。 2.办公楼、商业
1、火灾时应能在消防控制室将火灾疏散层的扬声器和公共广播扩音机强制转入火灾应急广播状态。 2、消防控制室应能监控用于火灾应急广播时的扩音机的工作状态,并应具有遥控开启扩音机和采用传声器播音的功能
1、火灾时应能在消防控制室将火灾疏散层的扬声器和公共广播扩音机强制转入火灾应急广播状态。 2、消防控制室应能监控用于火灾应急广播时的扩音机的工作状态,并应具有遥控开启扩音机和采用传声器播音的功能
1、控制中心报警系统、集中报警系统宜设置火灾应急广播; 2、民用建筑内扬声器应设在走道和大厅等公共场所; 3、火灾时应能将火灾疏散层的场声器和公共广播强制专转入火灾应急广播状态; 4、消控室
1、控制中心报警系统、集中报警系统宜设置火灾应急广播; 2、民用建筑内扬声器应设在走道和大厅等公共场所; 3、火灾时应能将火灾疏散层的场声器和公共广播强制专转入火灾应急广播状态; 4、消控室