Module java.base

Interface MulticastChannel

所有超级接口:
AutoCloseable, Channel, Closeable, NetworkChannel
所有已知实现类:
DatagramChannel

public interface MulticastChannel extends NetworkChannel
支持Internet Protocol(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)方法加入组并接收发送到该组的所有多播数据报。一个通道可以加入多个多播组,也可以在多个接口上加入相同的组。通过在返回的MembershipKey上调用drop方法来取消成员资格。如果底层平台支持源过滤,则可以使用blockunblock方法来阻止或解除阻止特定源地址的多播数据报。

使用join(InetAddress,NetworkInterface,InetAddress)方法开始接收发送到与给定源地址匹配的组的数据报。如果底层平台不支持源过滤,则此方法会抛出UnsupportedOperationException。成员资格是累积的,可以再次调用此方法以允许从其他源地址接收数据报。该方法返回一个代表从给定源地址接收数据报的MembershipKey。调用键的drop方法会取消成员资格,使得无法再接收来自源地址的数据报。

平台依赖性

多播实现旨在直接映射到本机多播功能。因此,在开发接收IP多播数据报的应用程序时,应考虑以下事项:
  1. 通道的创建应指定与通道将加入的多播组的地址类型对应的ProtocolFamily。不能保证一个协议族的套接字通道可以加入并接收另一个协议族对应的多播组的数据报。例如,如果通道到一个IPv6套接字,可以加入一个IPv4多播组并接收发送到该组的多播数据报,这取决于具体实现。

  2. 通道的套接字应绑定到通配符地址。如果套接字绑定到特定地址而不是通配符地址,则根据具体实现,套接字是否接收多播数据报是不确定的。

  3. 绑定套接字之前应启用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 Details

    • close

      void close() throws IOException
      关闭此通道。

      如果通道是多播组的成员,则成员资格将被取消。返回时,成员资格密钥将变为无效

      此方法在其他方面的行为与Channel接口指定的完全相同。

      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Channel
      指定者:
      close 在接口 Closeable
      抛出:
      IOException - 如果发生I/O错误
    • join

      MembershipKey join(InetAddress group, NetworkInterface interf) throws IOException
      加入多播组以开始接收发送到该组的所有数据报,返回成员资格密钥。

      如果此通道当前是在给定接口上接收所有数据报的组的成员,则返回代表该成员资格的成员密钥。否则,此通道加入该组,并返回新的成员密钥。生成的成员密钥不是源特定的。

      多播通道可以加入多个多播组,包括在多个接口上加入相同的组。实现可能对同时加入的组数施加限制。

      参数:
      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方法拒绝访问多播组