- 所有已实现的接口:
-
Closeable
,AutoCloseable
MulticastSocket
是一个数据报套接字,方便发送和接收IP多播数据报。 MulticastSocket
构造函数创建一个带有适当套接字选项的套接字,使其适合接收多播数据报。 MulticastSocket
类还定义了方便的设置器和获取器方法,用于常用于多播应用程序的套接字选项。
加入一个或多个多播组可以接收发送到这些组的多播数据报。
IPv4多播组由一个D类IP地址和一个标准UDP端口号指定。 D类IP地址的范围是224.0.0.0
到239.255.255.255
,包括这两个地址。地址224.0.0.0是保留的,不应使用。
首先通过使用所需端口创建一个MulticastSocket,然后调用joinGroup
方法,指定组地址和将接收多播数据报的网络接口,可以加入多播组:
// 加入一个多播组并发送组的问候语
...
String msg = "你好";
InetAddress mcastaddr = InetAddress.getByName("228.5.6.7");
InetSocketAddress group = new InetSocketAddress(mcastaddr, 6789);
NetworkInterface netIf = NetworkInterface.getByName("bge0");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(new InetSocketAddress(mcastaddr, 0), netIf);
byte[] msgBytes = msg.getBytes(StandardCharsets.UTF_8);
DatagramPacket hi = new DatagramPacket(msgBytes, msgBytes.length, group);
s.send(hi);
// 获取他们的响应!
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
...
// 好的,我说完了 - 离开这个组...
s.leaveGroup(group, netIf);
当向多播组发送消息时,所有订阅该主机和端口的接收方都会接收消息(在数据包的生存时间范围内,见下文)。套接字不需要是多播组的成员才能向其发送消息。
当套接字订阅多播组/端口时,它将接收其他主机发送到该组/端口的数据报,所有组和端口的其他成员也将接收到。套接字通过leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)方法放弃对组的成员资格。 多个MulticastSockets可以同时订阅一个多播组和端口,并且它们都将接收组数据报。
DatagramSocket
和MulticastSocket
类定义了方便的方法来设置和获取几个套接字选项。与DatagramSocket
类似,此类还支持setOption
和getOption
方法来设置和查询套接字选项。支持的套接字选项集在DatagramSocket
中定义。还可能支持其他(特定于实现的)选项。
- API注释:
-
DatagramSocket
可以直接用于发送和接收多播数据报。DatagramChannel
实现了MulticastChannel
接口,并提供了一个用于发送和接收多播数据报的替代API。MulticastChannel
API支持任意源和特定源多播。考虑使用DatagramChannel
进行多播。 - 自版本:
- 1.1
-
Constructor Summary
ConstructorsConstructorDescription构造一个多播套接字并将其绑定到本地主机上的任何可用端口。MulticastSocket
(int port) 构造一个多播套接字并将其绑定到本地主机上指定的端口。MulticastSocket
(SocketAddress bindaddr) 创建一个多播套接字,绑定到指定的本地套接字地址。 -
Method Summary
Modifier and TypeMethodDescription已弃用。通过返回的InetAddress可能无法唯一标识网络接口。boolean
获取为从此套接字发送的出站多播数据报设置的多播网络接口。int
获取套接字发送的多播数据包的默认生存时间。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) 已弃用。使用以下代码或其等效代码代替:void
setInterface
(InetAddress inf) 已弃用。InetAddress可能无法唯一标识网络接口。void
setLoopbackMode
(boolean disable) void
指定用于在此套接字上发送的出站多播数据报的网络接口。void
setTimeToLive
(int ttl) 设置在此MulticastSocket
上发送的多播数据包的默认生存时间,以控制多播的范围。void
setTTL
(byte ttl) 已弃用。使用setTimeToLive(int)
方法,该方法使用int而不是byte作为ttl的类型。Methods declared in 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, supportedOptions
-
Constructor Details
-
MulticastSocket
构造一个多播套接字并将其绑定到本地主机上的任何可用端口。套接字将绑定到wildcard
地址。如果存在安全管理器,则首先调用其
checkListen
方法,参数为0,以确保允许该操作。这可能导致SecurityException。创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)
方法以启用SO_REUSEADDR套接字选项。- 抛出:
-
IOException
- 如果创建MulticastSocket时发生I/O异常 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 - 参见:
-
MulticastSocket
构造一个多播套接字并将其绑定到本地主机上指定的端口。套接字将绑定到wildcard
地址。如果存在安全管理器,则首先调用其
checkListen
方法,将port
参数作为其参数,以确保允许该操作。这可能导致SecurityException。创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)
方法以启用SO_REUSEADDR套接字选项。- 参数:
-
port
- 要使用的端口 - 抛出:
-
IOException
- 如果创建MulticastSocket时发生I/O异常 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作。 -
IllegalArgumentException
- 如果端口超出范围。 - 参见:
-
MulticastSocket
创建一个多播套接字,绑定到指定的本地套接字地址。如果地址为
null
,将创建一个未绑定的套接字。如果存在安全管理器,则首先调用其
checkListen
方法,将SocketAddress端口作为其参数,以确保允许该操作。这可能导致SecurityException。创建套接字时,将调用
DatagramSocket.setReuseAddress(boolean)
方法以启用SO_REUSEADDR套接字选项。- 参数:
-
bindaddr
- 要绑定到的套接字地址,或null
表示未绑定的套接字。 - 抛出:
-
IOException
- 如果在创建MulticastSocket时发生I/O异常 -
SecurityException
- 如果存在安全管理器且其checkListen
方法不允许该操作 - 自版本:
- 1.4
- 参见:
-
-
Method Details
-
setTTL
Deprecated.use thesetTimeToLive(int)
method instead, which uses int instead of byte as the type for ttl.设置发送到此MulticastSocket
的多播数据包的默认生存时间,以控制多播的范围。ttl是一个无符号的8位数量,因此必须在范围
0 <= ttl <= 0xFF
内。- 参数:
-
ttl
- 生存时间 - 抛出:
-
IOException
- 如果设置默认生存时间值时发生I/O异常 - 参见:
-
setTimeToLive
设置发送到此MulticastSocket
的多播数据包的默认生存时间,以控制多播的范围。ttl必须在范围
0 <= ttl <= 255
内,否则将抛出IllegalArgumentException
。使用生存时间为0
发送的多播数据包不会在网络上传输,但可能会在本地传递。- API注释:
-
此方法等效于调用
setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl)
。 - 参数:
-
ttl
- 生存时间 - 抛出:
-
IOException
- 如果设置默认生存时间值时发生I/O异常 - 自版本:
- 1.2
- 参见:
-
getTTL
Deprecated.use thegetTimeToLive()
method instead, which returns an int instead of a byte.获取套接字发送的多播数据包的默认生存时间。- 返回:
- 默认生存时间值
- 抛出:
-
IOException
- 获取默认生存时间值时发生I/O异常 - 参见:
-
getTimeToLive
获取套接字发送的多播数据包的默认生存时间。- API注释:
-
此方法等效于调用
getOption(StandardSocketOptions.IP_MULTICAST_TTL)
。 - 返回:
- 默认生存时间值
- 抛出:
-
IOException
- 获取默认生存时间值时发生I/O异常 - 自版本:
- 1.2
- 参见:
-
joinGroup
Deprecated.This method does not accept the network interface on which to join the multicast group. UsejoinGroup(SocketAddress, NetworkInterface)
instead.加入一个多播组。其行为可能受setInterface
或setNetworkInterface
的影响。如果存在安全管理器,此方法首先以
mcastaddr
参数调用其checkMulticast
方法。- API注释:
-
调用此方法等效于调用
joinGroup(new InetSocketAddress(mcastaddr, 0), null)
。 - 参数:
-
mcastaddr
- 要加入的多播地址 - 抛出:
-
IOException
- 如果加入时出现错误,或地址不是多播地址,或平台不支持多播 -
SecurityException
- 如果存在安全管理器且其checkMulticast
方法不允许加入 - 参见:
-
leaveGroup
Deprecated.This method does not accept the network interface on which to leave the multicast group. UseleaveGroup(SocketAddress, NetworkInterface)
instead.离开一个多播组。其行为可能受setInterface
或setNetworkInterface
的影响。如果存在安全管理器,此方法首先以
mcastaddr
参数调用其checkMulticast
方法。- API注释:
-
调用此方法等效于调用
leaveGroup(new InetSocketAddress(mcastaddr, 0), null)
。 - 参数:
-
mcastaddr
- 要离开的多播地址 - 抛出:
-
IOException
- 如果离开时出现错误,或地址不是多播地址 -
SecurityException
- 如果存在安全管理器且其checkMulticast
方法不允许该操作 - 参见:
-
joinGroup
加入一个多播组。为了加入一个多播组,调用者应指定要加入的多播组的IP地址,以及接收多播数据包的本地网络接口。
mcastaddr
参数指示要加入的多播组的IP地址。出于历史原因,这被指定为SocketAddress
。默认实现仅支持InetSocketAddress
,并且忽略port
信息。netIf
参数指定接收多播数据报包的本地接口,或null
以推迟到为传出多播数据报包设置的接口。如果null
,且未设置任何接口,则行为是未指定的:可能选择任何接口或操作可能失败并出现SocketException
。
可以多次调用此方法以加入多个不同的多播组,或在多个不同网络中加入相同的组。但是,如果套接字已经是组的成员,则会抛出
IOException
。如果存在安全管理器,此方法首先以
mcastaddr
参数调用其checkMulticast
方法。- 覆盖:
-
joinGroup
在类DatagramSocket
- 参数:
-
mcastaddr
- 指示要加入的多播地址。 -
netIf
- 指定接收多播数据报包的本地接口,或null
。 - 抛出:
-
IOException
- 如果加入时出现错误,或地址不是多播地址,或平台不支持多播 -
SecurityException
- 如果存在安全管理器且其checkMulticast
方法不允许加入 -
IllegalArgumentException
- 如果mcastaddr为null
或是此套接字不支持的SocketAddress子类 - 自版本:
- 1.4
- 参见:
-
leaveGroup
在指定的本地接口上离开一个多播组。如果存在安全管理器,此方法首先以
mcastaddr
参数调用其checkMulticast
方法。- 覆盖:
-
leaveGroup
在类DatagramSocket
中 - API 注释:
-
参数
mcastaddr
和netIf
应该标识出此DatagramSocket
先前已经 加入 的多播组。可以多次调用此方法以离开先前加入的多个不同多播组,或者离开先前在多个不同网络中加入的相同组。但是,如果套接字不是指定网络中指定组的成员,则会抛出
IOException
。 - 参数:
-
mcastaddr
- 要离开的多播地址。这应该包含与 加入 组时使用的 IP 地址相同。 -
netIf
- 指定本地接口或null
以推迟到为传出多播数据报设置的接口。如果为null
,且未设置任何接口,则行为是未指定的:可能选择任何接口或操作可能因SocketException
失败。 - 抛出:
-
IOException
- 如果离开时出现错误或地址不是多播地址。 -
SecurityException
- 如果存在安全管理器且其checkMulticast
方法不允许该操作。 -
IllegalArgumentException
- 如果 mcastaddr 为null
或是此套接字不支持的 SocketAddress 子类。 - 自:
- 1.4
- 参见:
-
setInterface
Deprecated.The InetAddress may not uniquely identify the network interface. UsesetNetworkInterface(NetworkInterface)
instead.设置影响网络接口值的方法使用的多播网络接口。对于多宿主主机非常有用。- 参数:
-
inf
- InetAddress - 抛出:
-
SocketException
- 如果底层协议中出现错误,例如 TCP 错误。 - 参见:
-
getInterface
Deprecated.The network interface may not be uniquely identified by the InetAddress returned. UsegetNetworkInterface()
instead.检索用于多播数据包的网络接口的地址。- 返回:
-
表示用于多播数据包的网络接口地址的
InetAddress
,如果未设置接口,则返回表示任何本地地址的InetAddress
。 - 抛出:
-
SocketException
- 如果底层协议中出现错误,例如 TCP 错误。 - 参见:
-
setNetworkInterface
指定用于从此套接字发送的传出多播数据报的网络接口。- API 注释:
-
此方法等效于调用
setOption(StandardSocketOptions.IP_MULTICAST_IF, netIf)
。 - 参数:
-
netIf
- 接口 - 抛出:
-
SocketException
- 如果底层协议中出现错误,例如 TCP 错误。 - 自:
- 1.4
- 参见:
-
getNetworkInterface
获取从此套接字发送的传出多播数据报设置的多播网络接口。- API 注释:
-
当设置接口时,此方法等效于调用
getOption(StandardSocketOptions.IP_MULTICAST_IF)
。 - 返回:
-
当前设置的多播
NetworkInterface
。当未设置接口时,将返回占位符 NetworkInterface;它具有一个 InetAddress 以表示任何本地地址。 - 抛出:
-
SocketException
- 如果底层协议中出现错误,例如 TCP 错误。 - 自:
- 1.4
- 参见:
-
setLoopbackMode
Deprecated.UseDatagramSocket.setOption(SocketOption, Object)
withStandardSocketOptions.IP_MULTICAST_LOOP
instead. The loopback mode is enabled by default,MulticastSocket.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false)
disables it.禁用/启用多播数据报的本地环回。该选项由平台的网络代码用作设置多播数据是否将被环回到本地套接字的提示。因为此选项是一个提示,想要验证环回模式设置为什么的应用程序应该调用
getLoopbackMode()
- 参数:
-
disable
-true
以禁用 LoopbackMode - 抛出:
-
SocketException
- 如果在设置值时发生错误 - 自:
- 1.4
- 参见:
-
getLoopbackMode
Deprecated.获取多播数据报的本地环回设置。- 返回:
- 如果 LoopbackMode 已被禁用,则返回 true
- 抛出:
-
SocketException
- 如果在获取值时发生错误 - 自:
- 1.4
- 参见:
-
send
Deprecated.Use the following code or its equivalent instead:...... int ttl = mcastSocket.getOption(StandardSocketOptions.IP_MULTICAST_TTL); mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, newttl); mcastSocket.send(p); mcastSocket.setOption(StandardSocketOptions.IP_MULTICAST_TTL, ttl); ......
发送数据报包到目的地,具有与套接字的默认 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
方法不允许发送。 -
PortUnreachableException
- 如果套接字连接到当前无法到达的目的地,则可能会抛出。请注意,不能保证一定会抛出异常。 -
IllegalArgumentException
- 如果套接字已连接,并且连接地址与数据包地址不同,或者套接字未连接且数据包地址未设置,或者其端口超出范围。 - 参见:
-