- 所有超级接口:
-
AutoCloseable
,Channel
,Closeable
,NetworkChannel
- 所有已知实现类:
-
DatagramChannel
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)
方法加入组并接收发送到该组的所有多播数据报。一个通道可以加入多个多播组,也可以在多个接口
上加入相同的组。通过在返回的MembershipKey
上调用drop
方法来取消成员资格。如果底层平台支持源过滤,则可以使用block
和unblock
方法来阻止或解除阻止特定源地址的多播数据报。
使用join(InetAddress,NetworkInterface,InetAddress)
方法开始接收发送到与给定源地址匹配的组的数据报。如果底层平台不支持源过滤,则此方法会抛出UnsupportedOperationException
。成员资格是累积的,可以再次调用此方法以允许从其他源地址接收数据报。该方法返回一个代表从给定源地址接收数据报的MembershipKey
。调用键的drop
方法会取消成员资格,使得无法再接收来自源地址的数据报。
平台依赖性
多播实现旨在直接映射到本机多播功能。因此,在开发接收IP多播数据报的应用程序时,应考虑以下事项:-
通道的创建应指定与通道将加入的多播组的地址类型对应的
ProtocolFamily
。不能保证一个协议族的套接字通道可以加入并接收另一个协议族对应的多播组的数据报。例如,如果通道到一个IPv6
套接字,可以加入一个IPv4
多播组并接收发送到该组的多播数据报,这取决于具体实现。 -
通道的套接字应绑定到
通配符
地址。如果套接字绑定到特定地址而不是通配符地址,则根据具体实现,套接字是否接收多播数据报是不确定的。 -
在
绑定
套接字之前应启用SO_REUSEADDR
选项。这是为了允许组的多个成员绑定到相同的地址。
使用示例:
// 在此接口上加入多播组,并使用此接口发送多播数据报
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
- 外部规范
-
Method Summary
Modifier and TypeMethodDescriptionvoid
close()
关闭此通道。join
(InetAddress group, NetworkInterface interf) 加入多播组以开始接收发送到该组的所有数据报,返回成员资格密钥。join
(InetAddress group, NetworkInterface interf, InetAddress source) 加入多播组以开始接收发送到该组的数据报,源地址为给定源地址。Methods declared in interface java.nio.channels.NetworkChannel
bind, getLocalAddress, getOption, setOption, supportedOptions
-
Method Details
-
close
- 指定者:
-
close
在接口AutoCloseable
中 - 指定者:
-
close
在接口Channel
中 - 指定者:
-
close
在接口Closeable
中 - 抛出:
-
IOException
- 如果发生I/O错误
-
join
加入多播组以开始接收发送到该组的所有数据报,返回成员资格密钥。如果此通道当前是在给定接口上接收所有数据报的组的成员,则返回代表该成员资格的成员密钥。否则,此通道加入该组,并返回新的成员密钥。生成的成员密钥不是
源特定
的。多播通道可以加入多个多播组,包括在多个接口上加入相同的组。实现可能对同时加入的组数施加限制。
- 参数:
-
group
- 要加入的多播地址 -
interf
- 要加入组的网络接口 - 返回:
- 成员资格密钥
- 抛出:
-
IllegalArgumentException
- 如果组参数不是多播
地址,或组参数是此通道不支持的地址类型 -
IllegalStateException
- 如果通道已在接口上具有组的源特定成员资格 -
UnsupportedOperationException
- 如果通道的套接字不是Internet协议套接字,或平台不支持多播 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 -
SecurityException
- 如果设置了安全管理器,并且其checkMulticast
方法拒绝访问多播组
-
join
MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source) throws IOException 加入一个多播组,开始接收从给定源地址发送到该组的数据报。如果此通道当前是在给定接口上的该组的成员,以接收来自给定源地址的数据报,则返回代表该成员身份的成员密钥。否则,此通道将加入该组,并返回生成的新成员密钥。生成的成员密钥是
特定源
的。成员关系是累积的,可以再次调用此方法,使用相同的组和接口,以允许接收由其他源地址发送到该组的数据报。
- 参数:
-
group
- 要加入的多播地址 -
interf
- 要加入组的网络接口 -
source
- 源地址 - 返回:
- 成员密钥
- 抛出:
-
IllegalArgumentException
- 如果组参数不是一个多播
地址,源参数不是单播地址,组参数是此通道不支持的地址类型,或源参数与组不是相同的地址类型 -
IllegalStateException
- 如果通道当前是在给定接口上的该组的成员,以接收所有数据报 -
UnsupportedOperationException
- 如果通道的套接字不是Internet协议套接字,或不支持源过滤,或平台不支持多播 -
ClosedChannelException
- 如果此通道已关闭 -
IOException
- 如果发生I/O错误 -
SecurityException
- 如果设置了安全管理器,并且其checkMulticast
方法拒绝访问多播组
-