模块  java.base
软件包  java.net

Class MulticastSocket

  • 实现的所有接口
    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可以同时订阅多播组和端口,并且它们都将接收组数据报。

    目前,小程序不允许使用多播套接字。

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

      • setTTL

        @Deprecated
        public void setTTL​(byte ttl)
                    throws IOException
        Deprecated.
        use the setTimeToLive method instead, which uses int instead of byte as the type for 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
        Deprecated.
        use the getTimeToLive method instead, which returns an int instead of a byte.
        获取在套接字上发送的多播数据包的默认生存时间。
        结果
        默认的生存时间值
        异常
        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
        Deprecated.
        Use the following code or its equivalent instead: ...... int ttl = mcastSocket.getTimeToLive(); mcastSocket.setTimeToLive(newttl); mcastSocket.send(p); mcastSocket.setTimeToLive(ttl); ......
        将数据报包发送到目的地,使用TTL(生存时间)而不是套接字的默认值。 该方法仅需要在需要特定TTL的情况下使用; 否则最好在套接字上设置一次TTL,并对所有数据包使用该默认TTL。 此方法改变套接字的默认TTL。 其行为可能受setInterface影响。

        如果有安全管理器,则此方法首先执行一些安全检查。 首先,如果p.getAddress().isMulticastAddress()为true,则此方法将p.getAddress()ttl作为其参数调用安全管理器的checkMulticast方法。 如果对该表达式的求值为false,则此方法将使用参数p.getAddress().getHostAddress()p.getPort()调用安全管理器的checkConnect方法。 如果不允许操作,则每次调用安全管理器方法都可能导致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)