- 所有已实现的接口:
Closeable,AutoCloseable
MulticastSocket 是一个数据报套接字,方便发送和接收 IP 多播数据报。 MulticastSocket 构造函数创建一个套接字,并启用适当的套接字选项,使其适合接收多播数据报。 MulticastSocket 类还为多播应用程序常用的套接字选项定义了方便的 setter 和 getter 方法。
加入一个或多个多播组可以接收发送到这些组的多播数据报。
IPv4 多播组由 D 类 IP 地址和标准 UDP 端口号指定。 D 类 IP 地址在 224.0.0.0 到 239.255.255.255 范围内(含)。地址 224.0.0.0 已保留,不应使用。
加入多播组的方法是首先创建一个具有所需端口的 MulticastSocket,然后调用 joinGroup 方法,指定组地址和接收多播数据报的网络接口:
// join a Multicast group and send the group salutations
...
String msg = "Hello";
InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
InetSocketAddress group = new InetSocketAddress(mcastaddr, 6789);
NetworkInterface netIf = NetworkInterface.getByName("bge0");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(new InetSocketAddress(mcastaddr, 0), netIf);
byte[] msgBytes = msg.getBytes(StandardCharsets.UTF_8);
DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, group);
s.send(hi);
// get their responses!
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
// OK, I'm done talking - leave the group...
s.leaveGroup(group, netIf);
当一个人向多播组发送消息时,全部订阅该主机和端口的收件人接收消息(在数据包的生存时间范围内,见下文)。套接字不需要是多播组的成员就可以向它发送消息。
当套接字订阅多播组/端口时,它接收其他主机发送到组/端口的数据报,组和端口的所有其他成员也是如此。套接字通过 leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) 方法放弃组中的成员资格。多个 MulticastSocket可以同时订阅一个多播组和端口,它们都会收到组数据报。
DatagramSocket 和 MulticastSocket 类定义了方便的方法来设置和获取多个套接字选项。与 DatagramSocket 一样,此类也支持 setOption 和 getOption 方法来设置和查询套接字选项。 支持的套接字选项集在 DatagramSocket 中定义。还可以支持其他(特定于实现的)选项。
- API 注意:
DatagramSocket可直接用于发送和接收多播数据报。DatagramChannel实现MulticastChannel接口并提供用于发送和接收多播数据报的替代 API。MulticastChannelAPI 支持 任何来源 和 来源特定 多播。考虑使用DatagramChannel进行多播。- 自从:
- 1.1
-
构造方法总结
构造方法构造方法描述构造多播套接字并将其绑定到本地主机上的任何可用端口。MulticastSocket(int port) 构造多播套接字并将其绑定到本地主机上的指定端口。MulticastSocket(SocketAddress bindaddr) 创建一个多播套接字,绑定到指定的本地套接字地址。 -
方法总结
修饰符和类型方法描述已弃用。返回的 InetAddress 可能无法唯一标识网络接口。boolean获取为从此套接字发送的传出多播数据报设置的多播网络接口。int获取在套接字上发送的多播数据包的默认生存时间。bytegetTTL()已弃用。请改用getTimeToLive()方法,它返回一个int代替字节.voidjoinGroup(InetAddress mcastaddr) 已弃用。此方法不接受加入多播组的网络接口。voidjoinGroup(SocketAddress mcastaddr, NetworkInterface netIf) 加入多播组。voidleaveGroup(InetAddress mcastaddr) 已弃用。此方法不接受离开多播组的网络接口。voidleaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) 在指定的本地接口上保留多播组。voidsend(DatagramPacket p, byte ttl) 已弃用。请改用以下代码或其等效代码:voidsetInterface(InetAddress inf) 已弃用。InetAddress 可能不会唯一标识网络接口。voidsetLoopbackMode(boolean disable) void指定用于在此套接字上发送的传出多播数据报的网络接口。voidsetTimeToLive(int ttl) 为在此MulticastSocket上发送的多播数据包设置默认生存时间,以控制多播的范围。voidsetTTL(byte ttl) 已弃用。请改用setTimeToLive(int)方法,该方法使用int代替字节作为 ttl 的类型。在类 java.net.DatagramSocket 中声明的方法
bind, close, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getOption, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setOption, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass, supportedOptions
-
构造方法详细信息
-
MulticastSocket
构造多播套接字并将其绑定到本地主机上的任何可用端口。套接字将绑定到wildcard地址。如果有安全管理器,它的
checkListen方法首先以 0 作为参数调用,以确保允许操作。这可能会导致 SecurityException。创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)方法以启用 SO_REUSEADDR 套接字选项。- 抛出:
IOException- 如果在创建 MulticastSocket 时发生 I/O 异常SecurityException- 如果安全管理器存在且其checkListen方法不允许该操作。- 参见:
-
MulticastSocket
构造多播套接字并将其绑定到本地主机上的指定端口。套接字将绑定到wildcard地址。如果有安全管理器,它的
checkListen方法首先以port参数作为参数调用,以确保允许操作。这可能会导致 SecurityException。创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)方法以启用 SO_REUSEADDR 套接字选项。- 参数:
port- 要使用的端口- 抛出:
IOException- 如果在创建 MulticastSocket 时发生 I/O 异常SecurityException- 如果安全管理器存在且其checkListen方法不允许该操作。IllegalArgumentException- 如果端口是 超出范围。- 参见:
-
MulticastSocket
创建一个多播套接字,绑定到指定的本地套接字地址。如果地址是
null,将创建一个未绑定的套接字。如果有安全管理器,它的
checkListen方法首先以 SocketAddress 端口作为参数调用,以确保允许操作。这可能会导致 SecurityException。创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)方法以启用 SO_REUSEADDR 套接字选项。- 参数:
bindaddr- 要绑定到的套接字地址,或null用于未绑定的套接字。- 抛出:
IOException- 如果在创建 MulticastSocket 时发生 I/O 异常SecurityException- 如果安全管理器存在且其checkListen方法不允许该操作。- 自从:
- 1.4
- 参见:
-
-
方法详情
-
setTTL
已弃用。请改用setTimeToLive(int)方法,该方法使用int代替字节作为 ttl 的类型。为在此MulticastSocket上发送的多播数据包设置默认生存时间,以控制多播的范围。ttl是一个未签名8位数量等必须在
0 <= ttl <= 0xFF范围内。- 参数:
ttl- 生存时间- 抛出:
IOException- 如果在设置默认生存时间值时发生 I/O 异常- 参见:
-
setTimeToLive
为在此MulticastSocket上发送的多播数据包设置默认生存时间,以控制多播的范围。ttl必须在
0 <= ttl <= 255范围内,否则将抛出IllegalArgumentException。以0的 TTL 发送的多播数据包不会在网络上传输,但可能会在本地传递。- API 注意:
-
此方法等效于调用
setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl)。 - 参数:
ttl- 生存时间- 抛出:
IOException- 如果在设置默认生存时间值时发生 I/O 异常- 自从:
- 1.2
- 参见:
-
getTTL
已弃用。请改用getTimeToLive()方法,它返回一个int代替字节.获取在套接字上发送的多播数据包的默认生存时间。- 返回:
- 默认生存时间值
- 抛出:
IOException- 如果在获取默认生存时间值时发生 I/O 异常- 参见:
-
getTimeToLive
获取在套接字上发送的多播数据包的默认生存时间。- API 注意:
-
此方法相当于调用
getOption(StandardSocketOptions.IP_MULTICAST_TTL)。 - 返回:
- 默认生存时间值
- 抛出:
IOException- 如果在获取默认生存时间值时发生 I/O 异常- 自从:
- 1.2
- 参见:
-
joinGroup
已弃用。此方法不接受加入多播组的网络接口。请改用joinGroup(SocketAddress, NetworkInterface)。加入多播组。它的行为可能会受到setInterface或setNetworkInterface的影响。如果有安全管理器,此方法首先调用其
checkMulticast方法,并将mcastaddr参数作为其参数。- API 注意:
-
调用此方法等同于调用
joinGroup(new InetSocketAddress(mcastaddr, 0), null)。 - 参数:
mcastaddr- 是要加入的多播地址- 抛出:
IOException- 如果加入错误,或者地址不是多播地址,或者平台不支持多播SecurityException- 如果安全管理器存在且其checkMulticast方法不允许加入。- 参见:
-
leaveGroup
已弃用。此方法不接受离开多播组的网络接口。请改用leaveGroup(SocketAddress, NetworkInterface)。离开多播组。它的行为可能会受到setInterface或setNetworkInterface的影响。如果有安全管理器,此方法首先调用其
checkMulticast方法,并将mcastaddr参数作为其参数。- API 注意:
-
调用此方法等同于调用
leaveGroup(new InetSocketAddress(mcastaddr, 0), null)。 - 参数:
mcastaddr- 是要离开的多播地址- 抛出:
IOException- 如果离开时出现错误或地址不是多播地址。SecurityException- 如果安全管理器存在且其checkMulticast方法不允许该操作。- 参见:
-
joinGroup
加入多播组。为了加入多播组,调用者应指定要加入的多播组的 IP 地址,以及要从中接收多播数据包的本地 网络接口。
mcastaddr参数表示要加入的多播组的 IP 地址。由于历史原因,这被指定为SocketAddress。默认实现仅支持InetSocketAddress而忽略port信息。netIf参数指定用于接收多播数据报包的本地接口,或null指定用于传出多播数据报的接口集。如果null并且没有设置接口,则行为未指定:可以选择任何接口或者操作可能会失败并显示SocketException。
可以多次调用此方法以加入多个不同的多播组,或者加入多个不同网络中的同一个组。但是,如果套接字已经是该组的成员,则会抛出
IOException。如果有安全管理器,此方法首先调用其
checkMulticast方法,并将mcastaddr参数作为其参数。- 重写:
joinGroup在类DatagramSocket中- 参数:
mcastaddr- 表示要加入的多播地址。netIf- 指定接收多播数据报包的本地接口,或null。- 抛出:
IOException- 如果加入错误,或者地址不是多播地址,或者平台不支持多播SecurityException- 如果安全管理器存在且其checkMulticast方法不允许加入。IllegalArgumentException- 如果 mcastaddr 是null或者是此套接字不支持的 SocketAddress 子类- 自从:
- 1.4
- 参见:
-
leaveGroup
在指定的本地接口上保留多播组。如果有安全管理器,此方法首先调用其
checkMulticast方法,并将mcastaddr参数作为其参数。- 重写:
leaveGroup在类DatagramSocket中- API 注意:
mcastaddr和netIf参数应该标识一个多播组,该多播组之前是 加入 由这个DatagramSocket。可以多次调用此方法以离开以前加入的多个不同的多播组,或者离开以前加入的同一个组在多个不同的网络中。但是,如果套接字不是指定网络中指定组的成员,则会抛出
IOException。- 参数:
mcastaddr- 是要离开的多播地址。这应该包含与用于 joining 组的 IP 地址相同的 IP 地址。netIf- 指定本地接口或null以遵从为传出多播数据报设置的接口。如果null并且没有设置接口,则行为未指定:可以选择任何接口或者操作可能会失败并显示SocketException。- 抛出:
IOException- 如果离开时出现错误或地址不是多播地址。SecurityException- 如果安全管理器存在且其checkMulticast方法不允许该操作。IllegalArgumentException- 如果 mcastaddr 是null或者是此套接字不支持的 SocketAddress 子类。- 自从:
- 1.4
- 参见:
-
setInterface
已弃用。InetAddress 可能不会唯一标识网络接口。请改用setNetworkInterface(NetworkInterface)。设置其行为受网络接口值影响的方法使用的多播网络接口。对多宿主主机有用。- 参数:
inf- InetAddress- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 参见:
-
getInterface
已弃用。返回的 InetAddress 可能无法唯一标识网络接口。请改用getNetworkInterface()。检索用于多播数据包的网络接口地址。- 返回:
InetAddress表示用于多播数据包的网络接口地址,或者如果未设置接口,则InetAddress表示任何本地地址。- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 参见:
-
setNetworkInterface
指定用于在此套接字上发送的传出多播数据报的网络接口。- API 注意:
-
此方法等同于调用
setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf)。 - 参数:
netIf- 接口- 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.4
- 参见:
-
getNetworkInterface
获取为从此套接字发送的传出多播数据报设置的多播网络接口。- API 注意:
-
当设置接口时,此方法相当于调用
getOption(StandardSocketOptions.IP_MULTICAST_IF)。 - 返回:
-
当前设置的多播
NetworkInterface。没有设置接口时返回一个占位符NetworkInterface;它有一个 InetAddress 来表示任何本地地址。 - 抛出:
SocketException- 如果底层协议出现错误,例如 TCP 错误。- 自从:
- 1.4
- 参见:
-
setLoopbackMode
已弃用。请改用DatagramSocket.setOption(SocketOption, Object)和StandardSocketOptions.IP_MULTICAST_LOOP。默认情况下启用环回模式,MulticastSocket.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)禁用它。禁用/启用多播数据报的本地环回。平台的网络代码使用该选项作为设置多播数据是否环回本地套接字的提示。因为这个选项是一个提示,所以想要验证环回模式设置为什么的应用程序应该调用
getLoopbackMode()- 参数:
disable-true禁用 LoopbackMode- 抛出:
SocketException- 如果在设置值时发生错误- 自从:
- 1.4
- 参见:
-
getLoopbackMode
获取多播数据报的本地环回设置。- 返回:
- 如果 LoopbackMode 已被禁用,则为真
- 抛出:
SocketException- 如果在获取值时发生错误- 自从:
- 1.4
- 参见:
-
send
已弃用。请改用以下代码或其等效代码:...... int ttl = mcastSocket.getOption(StandardSocketOptions.IP_MULTICAST_TTL); mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, newttl); mcastSocket.send(p); mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl); ......将数据报包发送到目的地,其 TTL(生存时间)不同于套接字的默认值。这种方法只需要在需要特定 TTL 的情况下使用;否则,最好在套接字上设置一次 TTL,并为所有数据包使用该默认 TTL。这个方法做not 更改套接字的默认 TTL。它的行为可能会受到setInterface的影响。如果有安全管理器,此方法首先执行一些安全检查。首先,如果
p.getAddress().isMulticastAddress()为真,则此方法以p.getAddress()和ttl作为参数调用安全管理器的checkMulticast方法。如果该表达式的计算结果为假,则此方法会调用安全管理器的checkConnect方法,参数为p.getAddress().getHostAddress()和p.getPort()。如果不允许操作,则每次调用安全管理器方法都可能导致 SecurityException。- 参数:
p- 是要发送的数据包。数据包应包含目标多播 ip 地址和要发送的数据。不需要成为组的成员就可以将数据包发送到目标多播地址。ttl- 多播数据包的可选生存时间。默认 ttl 为 1。- 抛出:
IOException- 如果发生错误即在设置 ttl 时出现错误。SecurityException- 如果安全管理器存在且其checkMulticast或checkConnect方法不允许发送。PortUnreachableException- 如果套接字连接到当前无法到达的目的地,则可能会抛出。请注意,不能保证会抛出异常。IllegalArgumentException- 如果套接字已连接,并且连接地址和数据包地址不同,或者如果套接字未连接且未设置数据包地址,或者其端口超出范围。- 参见:
-