java.net

接口
异常
java.lang.Object
  继承者 java.net.DatagramSocket
      继承者 java.net.MulticastSocket

public class MulticastSocket
     
extends DatagramSocket

多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

多播组通过 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 使用多播套接字。

从以下版本开始:
JDK1.1

构造方法摘要
MulticastSocket()
          创建多播套接字。
MulticastSocket(int port)
          创建多播套接字并将其绑定到特定端口。
MulticastSocket(SocketAddress bindaddr)
          创建绑定到指定套接字地址的 MulticastSocket。
 
方法摘要
 InetAddress getInterface()
          获取用于多播数据包的网络接口的地址。
 boolean getLoopbackMode()
          获取多播数据报的本地回送的设置。
 NetworkInterface getNetworkInterface()
          获取多播网络接口集合。
 int getTimeToLive()
          获取在套接字上发出的多播数据包的默认生存时间。
 byte getTTL()
          已过时。 使用 getTimeToLive 方法来代替,该方法返回 int(而不是 byte)。
 void joinGroup(InetAddress mcastaddr)
          加入多播组。
 void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
          加入指定接口上的指定多播组。
 void leaveGroup(InetAddress mcastaddr)
          离开多播组。
 void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
          离开指定本地接口上的多播组。
 void send(DatagramPacket p, byte ttl)
          已过时。 使用以下代码或其等效代码:...... int ttl = mcastSocket.getTimeToLive(); mcastSocket.setTimeToLive(newttl); mcastSocket.send(p); mcastSocket.setTimeToLive(ttl); ......
 void setInterface(InetAddress inf)
          设置多播网络接口,供其行为将受网络接口值影响的方法使用。
 void setLoopbackMode(boolean disable)
          启用/禁用多播数据报的本地回送。
 void setNetworkInterface(NetworkInterface netIf)
          指定在此套接字上发送的输出多播数据报的网络接口。
 void setTimeToLive(int ttl)
          设置在此 MulticastSocket 上发出的多播数据包的默认生存时间,以便控制多播的范围。
 void setTTL(byte ttl)
          已过时。 使用 setTimeToLive 方法来代替,该方法使用 int(而不用 byte)作为 ttl 的类型。
 
从类 java.net.DatagramSocket 继承的方法
bind, close, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

MulticastSocket

public MulticastSocket()
                throws IOException
创建多播套接字。

如果有安全管理器,则首先使用 0 作为变量来调用其 checkListen 方法,以确保允许该操作。这可能会导致 SecurityException 异常。

创建套接字时,将调用 DatagramSocket.setReuseAddress(boolean) 方法来启用 SO_REUSEADDR 套接字选项。

抛出:
IOException - 如果在创建 MulticastSocket 时发生 I/O 异常
SecurityException - 如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
另请参见:
SecurityManager.checkListen(int), DatagramSocket.setReuseAddress(boolean)

MulticastSocket

public MulticastSocket(int port)
                throws IOException
创建多播套接字并将其绑定到特定端口。

如果存在安全管理器,则首先使用 port 参数作为参数调用其 checkListen 方法,以确保允许该操作。这可能会导致 SecurityException 异常。

创建套接字时,将调用 DatagramSocket.setReuseAddress(boolean) 方法来启用 SO_REUSEADDR 套接字选项。

参数:
port - 要使用的端口
抛出:
IOException - 如果在创建 MulticastSocket 时发生 I/O 异常
SecurityException - 如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
另请参见:
SecurityManager.checkListen(int), DatagramSocket.setReuseAddress(boolean)

MulticastSocket

public MulticastSocket(SocketAddress bindaddr)
                throws IOException
创建绑定到指定套接字地址的 MulticastSocket。

或者,如果地址为 null,则创建未绑定套接字。

如果有安全管理器,则首先使用 SocketAddress 端口作为参数来调用其 checkListen 方法,以确保允许该操作。这可能会导致 SecurityException 异常。

创建套接字时,将调用 DatagramSocket.setReuseAddress(boolean) 方法来启用 SO_REUSEADDR 套接字选项。

参数:
bindaddr - 要绑定到的套接字地址;或者为 null,它表示非绑定套接字。
抛出:
IOException - 如果在创建 MulticastSocket 时发生 I/O 异常
SecurityException - 如果安全管理器存在并且其 checkListen 方法不允许进行该操作。
从以下版本开始:
1.4
另请参见:
SecurityManager.checkListen(int), DatagramSocket.setReuseAddress(boolean)
方法详细信息

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。

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

getTTL

@Deprecated
public byte getTTL()
            throws IOException
已过时。  使用 getTimeToLive 方法来代替,该方法返回 int(而不是 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 的影响。

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

参数:
mcastaddr - 要离开的多播地址
抛出:
IOException - 如果存在错误离开或者当地址不是多播地址时。
SecurityException - 如果安全管理器存在并且其 checkMulticast 方法不允许进行该操作。
另请参见:
SecurityManager.checkMulticast(InetAddress)

joinGroup

public void joinGroup(SocketAddress mcastaddr,
                      NetworkInterface netIf)
               throws IOException
加入指定接口上的指定多播组。

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

参数:
mcastaddr - 要加入的多播地址
netIf - 指定要接收多播数据报包的本地接口;或者为 null,表示由 setInterface(InetAddress)setNetworkInterface(NetworkInterface) 设置的接口
抛出:
IOException - 如果存在错误加入或者当地址不是多播地址时。
SecurityException - 如果安全管理器存在并且其 checkMulticast 方法不允许加入。
IllegalArgumentException - 如果 mcastaddr 为 null 或者为此套接字不支持的 SocketAddress 子类。
从以下版本开始:
1.4
另请参见:
SecurityManager.checkMulticast(InetAddress)

leaveGroup

public void leaveGroup(SocketAddress mcastaddr,
                       NetworkInterface netIf)
                throws IOException
离开指定本地接口上的多播组。

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

参数:
mcastaddr - 要离开的多播地址
netIf - 指定本地接口;或者为 null,表示由 setInterface(InetAddress)setNetworkInterface(NetworkInterface) 设置的接口
抛出:
IOException - 如果存在错误离开或者当地址不是多播地址时。
SecurityException - 如果安全管理器存在并且其 checkMulticast 方法不允许进行该操作。
IllegalArgumentException - 如果 mcastaddr 为 null 或者为此套接字不支持的 SocketAddress 子类。
从以下版本开始:
1.4
另请参见:
SecurityManager.checkMulticast(InetAddress)

setInterface

public void setInterface(InetAddress inf)
                  throws SocketException
设置多播网络接口,供其行为将受网络接口值影响的方法使用。对多宿主机 (multihomed host) 很有用。

参数:
inf - InetAddress
抛出:
SocketException - 如果在底层协议中存在错误,如 TCP 错误。
另请参见:
getInterface()

getInterface

public InetAddress getInterface()
                         throws SocketException
获取用于多播数据包的网络接口的地址。

返回:
表示用于多播数据包的网络接口地址的 InetAddress
抛出:
SocketException - 如果底层协议出现错误,例如 TCP 错误。
另请参见:
setInterface(java.net.InetAddress)

setNetworkInterface

public void setNetworkInterface(NetworkInterface netIf)
                         throws SocketException
指定在此套接字上发送的输出多播数据报的网络接口。

参数:
netIf - 接口
抛出:
SocketException - 如果在底层协议中存在错误,如 TCP 错误。
从以下版本开始:
1.4
另请参见:
getNetworkInterface()

getNetworkInterface

public NetworkInterface getNetworkInterface()
                                     throws SocketException
获取多播网络接口集合。

返回:
当前设置的多播 NetworkInterface
抛出:
SocketException - 如果底层协议出现错误,例如 TCP 错误。
从以下版本开始:
1.4
另请参见:
setNetworkInterface(NetworkInterface)

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() 为 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)