Module  java.base
软件包  java.net

Class MulticastSocket

  • All Implemented Interfaces:
    CloseableAutoCloseable


    public class MulticastSocket
    extends DatagramSocket
    组播数据报套接字类对发送和接收IP组播数据包很有用。 MulticastSocket是一个(UDP)DatagramSocket,具有加入互联网上其他组播主机的“组”的附加功能。

    组播组由D类IP地址和标准UDP端口号指定。 D类IP地址范围为224.0.0.0239.255.255.255 (含)。 地址224.0.0.0是保留的,不应该使用。

    一个可以通过首先创建具有所需端口的MulticastSocket来加入多播组,然后调用joinGroup(InetAddress groupAddr)方法:

      // join a Multicast group and send the group salutations
     ...
     String msg = "Hello";
     InetAddress group = InetAddress.getByName("228.5.6.7");
     MulticastSocket s = new MulticastSocket(6789);
     s.joinGroup(group);
     DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
                                 group, 6789);
     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); 
    当向多播组发送消息时,向该主机和端口发送的所有订阅的收件人都将收到消息(在数据包的生存时间内,请参见下文)。 套接字不需要是组播组的成员来向其发送消息。

    当一个套接字订阅一个组播组/端口时,它接收其他主机发送到组/端口的数据报,组和端口的所有其他成员也同样。 套接字通过leaveGroup(InetAddress addr)方法放弃组中的成员资格。 多个MulticastSocket可以同时订阅组播组和端口,并且它们都将接收组数据报。

    目前applet不允许使用组播套接字。

    从以下版本开始:
    1.1
    • 方法详细信息

      • setTTL

        @Deprecated
        public void setTTL​(byte ttl)
                    throws IOException
        已过时。 使用setTimeToLive方法,它使用int而不是byte作为ttl的类型。
        为此MulticastSocket发送的组播数据包的默认生存时间为了控制组播的范围。

        ttl是一个无符号的 8位数,因此必须0 <= ttl <= 0xFF范围内。

        参数
        ttl - 生存时间
        异常
        IOException - 如果在设置默认生存时间值时发生I / O异常
        另请参见:
        getTTL()
      • setTimeToLive

        public void setTimeToLive​(int ttl)
                           throws IOException
        为此MulticastSocket发送的组播数据包的默认生存时间为了控制组播的范围。

        ttl 必须0 <= ttl <= 255范围内, IllegalArgumentException将抛出IllegalArgumentException 发送TTL为0不在网络上传输,但可能在本地传送。

        参数
        ttl - 生存时间
        异常
        IOException - 如果在设置默认生存时间值时发生I / O异常
        另请参见:
        getTimeToLive()
      • getTTL

        @Deprecated
        public byte getTTL​()
                    throws IOException
        已过时。 使用getTimeToLive方法,它返回一个int而不是一个字节
        获取在套接字上发送的组播数据包的默认生存时间。
        结果
        默认的生存时间值
        异常
        IOException - 如果在获取默认生存时间值的情况下发生I / O异常
        另请参见:
        setTTL(byte)
      • getTimeToLive

        public int getTimeToLive​()
                          throws IOException
        获取在套接字上发送的组播数据包的默认生存时间。
        结果
        默认的生存时间值
        异常
        IOException - 如果在获取默认生存时间值时发生I / O异常
        另请参见:
        setTimeToLive(int)
      • joinGroup

        public void joinGroup​(InetAddress mcastaddr)
                       throws IOException
        加入组播组。 其行为可能受到setInterfacesetNetworkInterface影响。

        如果有安全管理器,则该方法首先使用mcastaddr参数作为参数来调用其checkMulticast方法。

        参数
        mcastaddr - 是要加入的组播地址
        异常
        IOException - 如果加入错误,或者地址不是组播地址,或平台不支持组播
        SecurityException - 如果存在安全管理员,并且其 checkMulticast方法不允许连接。
        另请参见:
        SecurityManager.checkMulticast(InetAddress)
      • leaveGroup

        public void leaveGroup​(InetAddress mcastaddr)
                        throws IOException
        离开多播组。 其行为可能受到setInterfacesetNetworkInterface影响。

        如果有一个安全管理器,这个方法首先调用它的checkMulticast方法,其中参数为mcastaddr

        参数
        mcastaddr - 是要离开的组播地址
        异常
        IOException - 如果出现错误或地址不是组播地址时出现错误。
        SecurityException - 如果存在安全管理员,并且其 checkMulticast方法不允许操作。
        另请参见:
        SecurityManager.checkMulticast(InetAddress)
      • setInterface

        public void setInterface​(InetAddress inf)
                          throws SocketException
        设置由行为受网络接口值影响的方法使用的组播网络接口。 适用于多宿主主机。
        参数
        inf - InetAddress
        异常
        SocketException - 如果底层协议有错误,如TCP错误。
        另请参见:
        getInterface()
      • setNetworkInterface

        public void setNetworkInterface​(NetworkInterface netIf)
                                 throws SocketException
        指定在此套接字上发送的出站组播数据报的网络接口。
        参数
        netIf - 界面
        异常
        SocketException - 如果底层协议有错误,如TCP错误。
        从以下版本开始:
        1.4
        另请参见:
        getNetworkInterface()
      • setLoopbackMode

        public void setLoopbackMode​(boolean disable)
                             throws SocketException
        禁用/启用组播数据报的本地环回该选项由平台的网络代码用作设置组播数据是否将环回到本地套接字的提示。

        因为这个选项是一个提示,想要验证什么环回模式设置的应用程序应该调用getLoopbackMode()

        参数
        disable - true禁用LoopbackMode
        异常
        SocketException - 如果在设置值时发生错误
        从以下版本开始:
        1.4
        另请参见:
        getLoopbackMode()
      • getLoopbackMode

        public boolean getLoopbackMode​()
                                throws SocketException
        获取组播数据报的本地环回设置。
        结果
        如果LoopbackMode被禁用则为true
        异常
        SocketException - 如果在获取值时发生错误
        从以下版本开始:
        1.4
        另请参见:
        setLoopbackMode(boolean)
      • send

        @Deprecated
        public void send​(DatagramPacket p,
                         byte ttl)
                  throws IOException
        已过时。 使用以下代码或其等价物:...... int ttl = mcastSocket.getTimeToLive(); mcastSocket.setTimeToLive(newttl); mcastSocket.send(P); mcastSocket.setTimeToLive(TTL); ......
        将数据报包发送到目的地,TTL(生存时间)不是套接字的默认值。 该方法只需要在需要特定TTL的情况下使用; 否则最好在套接字上设置TTL一次,并对所有数据包使用该默认TTL。 此方法改变套接字的默认TTL。 其行为可能受到setInterface影响。

        如果有安全管理器,则该方法首先执行一些安全检查。 首先,如果p.getAddress().isMulticastAddress()为真,则该方法调用安全管理器的checkMulticast方法,其中p.getAddress()ttl作为参数。 如果该表达式的评估为false,则该方法会调用安全性管理器的checkConnect方法,其参数为p.getAddress().getHostAddress()p.getPort() 每次调用安全管理器方法都可能导致SecurityException,如果不允许操作。

        参数
        p - 是要发送的数据包。 数据包应包含目标组播IP地址和要发送的数据。 一个不需要是组的成员发送报文到目的组播地址。
        ttl - 组播数据包的可选时间。 默认ttl为1。
        异常
        IOException - 如果发生错误,即设置ttl时发生错误,则会引发。
        SecurityException - 如果存在安全管理员,并且其 checkMulticastcheckConnect方法不允许发送。
        另请参见:
        DatagramSocket.send(java.net.DatagramPacket)DatagramSocket.receive(java.net.DatagramPacket)SecurityManager.checkMulticast(java.net.InetAddress, byte)SecurityManager.checkConnect(java.lang.String, int)
      • supportedOptions

        public Set<SocketOption<?>> supportedOptions​()
        描述从类复制: DatagramSocket
        返回此套接字支持的一组套接字选项。 即使在套接字关闭后,此方法也将继续返回该选项。
        重写:
        supportedOptionsDatagramSocket
        结果
        该套接字支持的一组套接字选项。 如果套接字的DatagramSocketImpl无法创建,则此集合可能为空。