-
- All Superinterfaces:
-
AutoCloseable
,Channel
,Closeable
,NetworkChannel
- 所有已知实现类:
-
DatagramChannel
public interface MulticastChannelextends NetworkChannel
支持Internet协议(IP)多播的网络通道。IP多播是将IP数据报传输到由单个目标地址标识的零个或多个主机的组的成员。
对于
IPv4
套接字的通道,底层操作系统可选择支持RFC 2236: Internet Group Management Protocol, Version 2 (IGMPv2) 。 当支持IGMPv2时,操作系统可另外支持源过滤,如RFC 3376: Internet Group Management Protocol, Version 3 (IGMPv3)所指定。 对于IPv6
插槽的通道,等效标准为RFC 2710: Multicast Listener Discovery (MLD) for IPv6和RFC 3810: Multicast Listener Discovery Version 2 (MLDv2) for IPv6 。join(InetAddress,NetworkInterface)
方法用于加入组并接收发送到该组的所有多播数据报。 一个通道可以加入多个多播组,并可以在几个interfaces
上加入同一个组。 通过在返回的MembershipKey
上调用drop
方法来删除成员资格。 如果底层平台支持源过滤,则可以使用block
和unblock
方法来阻止或取消阻止来自特定源地址的多播数据报。join(InetAddress,NetworkInterface,InetAddress)
方法用于开始接收发送到源地址与给定源地址匹配的组的数据报。 如果底层平台不支持源过滤,则此方法抛出UnsupportedOperationException
。 成员资格是累积的 ,可以使用相同的组和接口再次调用此方法,以允许从其他源地址接收数据报。 该方法返回MembershipKey
,表示从给定源地址接收数据报的成员资格。 调用密钥的drop
方法会删除成员资格,以便无法再接收来自源地址的数据报。平台依赖
多播实现旨在直接映射到本机多播设施。 因此,在开发接收IP多播数据报的应用程序时,应考虑以下各项:通道的创建应指定
ProtocolFamily
,该通信将与通道将加入的多播组的地址类型相对应。 当多播组的地址对应于另一个协议族时,无法保证一个协议族中的套接字的通道可以加入和接收多播数据报。 例如,如果到IPv6
套接字的通道可以加入IPv4
多播组并接收发送到该组的多播数据报,则它是特定于实现的。通道的套接字应绑定到
wildcard
地址。 如果套接字绑定到特定地址而不是通配符地址,那么如果套接字接收到多播数据报,则它是特定于实现的。应在
binding
套接字之前启用SO_REUSEADDR
选项。 这是允许组的多个成员绑定到同一地址所必需的。
用法示例:
// join multicast group on this interface, and also use this // interface for outgoing multicast datagrams NetworkInterface ni = NetworkInterface.getByName("hme0"); DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) .setOption(StandardSocketOptions.SO_REUSEADDR, true) .bind(new InetSocketAddress(5000)) .setOption(StandardSocketOptions.IP_MULTICAST_IF, ni); InetAddress group = InetAddress.getByName("225.4.5.6"); MembershipKey key = dc.join(group, ni);
- 从以下版本开始:
- 1.7
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 void
close()
关闭此频道。MembershipKey
join(InetAddress group, NetworkInterface interf)
加入多播组以开始接收发送给该组的所有数据报,并返回成员资格密钥。MembershipKey
join(InetAddress group, NetworkInterface interf, InetAddress source)
加入多播组以开始接收从给定源地址发送到该组的数据报。-
声明方法的接口 java.nio.channels.NetworkChannel
bind, getLocalAddress, getOption, setOption, supportedOptions
-
-
-
-
方法详细信息
-
close
void close() throws IOException
- Specified by:
-
close
在界面AutoCloseable
- Specified by:
-
close
在界面Channel
- Specified by:
-
close
,接口Closeable
- 异常
-
IOException
- 如果发生I / O错误
-
join
MembershipKey join(InetAddress group, NetworkInterface interf) throws IOException
加入多播组以开始接收发送给该组的所有数据报,并返回成员资格密钥。如果此通道当前是给定接口上的组的成员以接收所有数据报,则返回表示该成员资格的成员资格密钥。 否则,此通道将加入组,并返回生成的新成员资格密钥。 生成的成员资格密钥不是
source-specific
。组播信道可以加入多个组播组,包括多个接口上的同一组。 实现可以对可以同时加入的组的数量施加限制。
- 参数
-
group
- 要加入的多播地址 -
interf
- 要加入组的网络接口 - 结果
- 会员密钥
- 异常
-
IllegalArgumentException
- 如果group参数不是multicast
地址,或者group参数是此通道不支持的地址类型 -
IllegalStateException
- 如果通道已在接口上具有该组的特定于源的成员身份 -
UnsupportedOperationException
- 如果通道的套接字不是Internet协议套接字,或者该平台不支持多播 -
ClosedChannelException
- 如果此渠道已关闭 -
IOException
- 如果发生I / O错误 -
SecurityException
- 如果设置了安全管理器,则其checkMulticast
方法拒绝访问多播组
-
join
MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source) throws IOException
加入多播组以开始接收从给定源地址发送到该组的数据报。如果此通道当前是给定接口上的组的成员,以从给定的源地址接收数据报,则返回表示该成员资格的成员资格密钥。 否则,此通道将加入组,并返回生成的新成员资格密钥。 生成的成员资格密钥为
source-specific
。成员资格是累积的,并且可以使用相同的组和接口再次调用此方法,以允许接收由其他源地址发送到该组的数据报。
- 参数
-
group
- 要加入的多播地址 -
interf
- 要加入组的网络接口 -
source
- 源地址 - 结果
- 会员密钥
- 异常
-
IllegalArgumentException
- 如果group参数不是multicast
地址,则source参数不是单播地址,group参数是此通道不支持的地址类型,或者source参数与组的地址类型不同 -
IllegalStateException
- 如果通道当前是给定接口上组的成员,则接收所有数据报 -
UnsupportedOperationException
- 如果通道的套接字不是Internet协议套接字,或者不支持源过滤,或者平台不支持多播 -
ClosedChannelException
- 如果此频道已关闭 -
IOException
- 如果发生I / O错误 -
SecurityException
- 如果设置了安全管理器,则其checkMulticast
方法拒绝访问多播组
-
-