- java.lang.Object
-
- java.net.DatagramSocket
-
- java.net.MulticastSocket
-
- 实现的所有接口
-
Closeable
,AutoCloseable
public class MulticastSocketextends 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可以同时订阅多播组和端口,并且它们都将接收组数据报。
目前,小程序不允许使用多播套接字。
- 从以下版本开始:
- 1.1
-
-
构造方法摘要
构造方法 构造器 描述 MulticastSocket()
创建多播套接字。MulticastSocket(int port)
创建多播套接字并将其绑定到特定端口。MulticastSocket(SocketAddress bindaddr)
创建绑定到指定套接字地址的MulticastSocket。
-
方法摘要
所有方法 实例方法 具体的方法 弃用的方法 变量和类型 方法 描述 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)
已过时。请改用以下代码或代码:......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, getOption, getPort, getReceiveBufferSize, getRemoteSocketAddress, getReuseAddress, getSendBufferSize, getSoTimeout, getTrafficClass, isBound, isClosed, isConnected, receive, send, setBroadcast, setDatagramSocketImplFactory, setOption, setReceiveBufferSize, setReuseAddress, setSendBufferSize, setSoTimeout, setTrafficClass, supportedOptions
-
-
-
-
构造方法详细信息
-
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
创建多播套接字并将其绑定到特定端口。如果存在安全管理器,则首先使用
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
@Deprecatedpublic 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
@Deprecatedpublic 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
加入多播组。 其行为可能受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
加入指定接口的指定组播组。如果有安全管理器,则此方法首先使用
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
在指定的本地接口上保留组播组。如果有安全管理器,则此方法首先调用其
checkMulticast
方法,并将mcastaddr
参数作为其参数。- 参数
-
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
设置行为受网络接口值影响的方法使用的组播网络接口。 适用于多宿主主机。- 参数
-
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
@Deprecatedpublic 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
- 如果存在安全管理器且其checkMulticast
或checkConnect
方法不允许发送。 - 另请参见:
-
DatagramSocket.send(java.net.DatagramPacket)
,DatagramSocket.receive(java.net.DatagramPacket)
,SecurityManager.checkMulticast(java.net.InetAddress, byte)
,SecurityManager.checkConnect(java.lang.String, int)
-
-