- java.lang.Object
-
- java.net.DatagramSocket
-
- java.net.MulticastSocket
-
- All Implemented Interfaces:
-
Closeable
,AutoCloseable
public class MulticastSocket extends DatagramSocket
组播数据报套接字类对发送和接收IP组播数据包很有用。 MulticastSocket是一个(UDP)DatagramSocket,具有加入互联网上其他组播主机的“组”的附加功能。组播组由D类IP地址和标准UDP端口号指定。 D类IP地址范围为
224.0.0.0
至239.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
-
-
构造方法摘要
构造方法 Constructor 描述 MulticastSocket()
创建组播套接字。MulticastSocket(int port)
创建组播套接字并将其绑定到特定端口。MulticastSocket(SocketAddress bindaddr)
创建一个绑定到指定套接字地址的MulticastSocket。
-
方法摘要
所有方法 接口方法 具体的方法 弃用的方法 Modifier and Type 方法 描述 InetAddress
getInterface()
检索用于组播数据包的网络接口的地址。boolean
getLoopbackMode()
获取组播数据报的本地环回设置。NetworkInterface
getNetworkInterface()
获取组播网络接口集。int
getTimeToLive()
获取在套接字上发送的组播数据包的默认生存时间。byte
getTTL()
已过时。使用getTimeToLive方法,它返回一个int而不是一个字节 。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的类型。Set<SocketOption<?>>
supportedOptions()
返回此套接字支持的一组套接字选项。-
Methods inherited from class java.net.DatagramSocket
bind, close, connect, connect, disconnect, getBroadcast, getChannel, getInetAddress, getLocalAddress, getLocalPort, getLocalSocketAddress, getOption, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setOption, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass
-
-
-
-
构造方法详细信息
-
MulticastSocket
public MulticastSocket() throws IOException
创建组播套接字。如果有一个安全管理器,它的
checkListen
方法首先被调用为0作为参数,以确保操作是允许的。 这可能会导致SecurityException。当创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。- 异常
-
IOException
- 如果在创建MulticastSocket时发生I / O异常 -
SecurityException
- 如果存在安全管理员,并且其checkListen
方法不允许该操作。 - 另请参见:
-
SecurityManager.checkListen(int)
,DatagramSocket.setReuseAddress(boolean)
,DatagramSocketImpl.setOption(SocketOption, Object)
-
MulticastSocket
public MulticastSocket(int port) throws IOException
创建组播套接字并将其绑定到特定端口。如果有安全管理器,则首先调用其
checkListen
方法,其参数为port
,以确保允许操作。 这可能会导致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
将抛出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
加入组播组。 其行为可能受到setInterface
或setNetworkInterface
影响。如果有安全管理器,则该方法首先使用
mcastaddr
参数作为参数来调用其checkMulticast
方法。- 参数
-
mcastaddr
- 是要加入的组播地址 - 异常
-
IOException
- 如果加入错误,或者地址不是组播地址,或平台不支持组播 -
SecurityException
- 如果存在安全管理员,并且其checkMulticast
方法不允许连接。 - 另请参见:
-
SecurityManager.checkMulticast(InetAddress)
-
leaveGroup
public void leaveGroup(InetAddress mcastaddr) throws IOException
离开多播组。 其行为可能受到setInterface
或setNetworkInterface
影响。如果有一个安全管理器,这个方法首先调用它的
checkMulticast
方法,其中参数为mcastaddr
。- 参数
-
mcastaddr
- 是要离开的组播地址 - 异常
-
IOException
- 如果出现错误或地址不是组播地址时出现错误。 -
SecurityException
- 如果存在安全管理员,并且其checkMulticast
方法不允许操作。 - 另请参见:
-
SecurityManager.checkMulticast(InetAddress)
-
joinGroup
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
在指定的接口加入指定的组播组。如果有一个安全管理器,这个方法首先调用它的
checkMulticast
方法,其参数为mcastaddr
。- 参数
-
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
在指定的本地接口上留下组播组。如果有一个安全管理器,这个方法首先调用它的
checkMulticast
方法,其中参数为mcastaddr
。- 参数
-
mcastaddr
- 是要离开的组播地址 -
netIf
- 指定本地接口或 空值为setInterface(InetAddress)
或setNetworkInterface(NetworkInterface)
设置的接口 - 异常
-
IOException
- 如果出现错误或地址不是组播地址。 -
SecurityException
- 如果安全管理器存在,并且其checkMulticast
方法不允许该操作。 -
IllegalArgumentException
- 如果mcastaddr为null或是此套接字不支持的SocketAddress子类 - 从以下版本开始:
- 1.4
- 另请参见:
-
SecurityManager.checkMulticast(InetAddress)
-
setInterface
public void setInterface(InetAddress inf) throws SocketException
设置由行为受网络接口值影响的方法使用的组播网络接口。 适用于多宿主主机。- 参数
-
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()
为真,则该方法调用安全管理器的checkMulticast
方法,其中p.getAddress()
和ttl
作为参数。 如果该表达式的评估为false,则该方法会调用安全性管理器的checkConnect
方法,其参数为p.getAddress().getHostAddress()
和p.getPort()
。 每次调用安全管理器方法都可能导致SecurityException,如果不允许操作。- 参数
-
p
- 是要发送的数据包。 数据包应包含目标组播IP地址和要发送的数据。 一个不需要是组的成员发送报文到目的组播地址。 -
ttl
- 组播数据包的可选时间。 默认ttl为1。 - 异常
-
IOException
- 如果发生错误,即设置ttl时发生错误,则会引发。 -
SecurityException
- 如果存在安全管理员,并且其checkMulticast
或checkConnect
方法不允许发送。 - 另请参见:
-
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
返回此套接字支持的一组套接字选项。 即使在套接字关闭后,此方法也将继续返回该选项。- 重写:
-
supportedOptions
在DatagramSocket
- 结果
- 该套接字支持的一组套接字选项。 如果套接字的DatagramSocketImpl无法创建,则此集合可能为空。
-
-