MulticastSocket
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.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 可以同时订阅一个组播组和端口,它们都将接收组数据报。
目前不允许小程序使用多播套接字。
构造函数摘要
构造函数 | 描述 |
---|---|
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) | 已弃用。 请改用以下代码或其等效代码:…… 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
创建一个多播套接字。
如果存在安全管理器,则首先调用其 checkListen 方法,并以 0 作为其参数,以确保允许该操作。 这可能会导致 SecurityException。
创建套接字时,调用 DatagramSocket#setReuseAddress(boolean) 方法以启用 SO_REUSEADDR 套接字选项。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在创建 MulticastSocket 时发生 I/O 异常 |
SecurityException | 如果安全管理器存在并且其 checkListen 方法不允许该操作。 |
MulticastSocket
public MulticastSocket(int port) throws IOException
创建一个多播套接字并将其绑定到特定端口。
如果有安全管理器,首先调用它的 checkListen 方法,并将端口参数作为其参数,以确保允许该操作。 这可能会导致 SecurityException。
创建套接字时,调用 DatagramSocket#setReuseAddress(boolean) 方法以启用 SO_REUSEADDR 套接字选项。
参数:
参数名称 | 参数描述 |
---|---|
port | 使用的端口 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在创建 MulticastSocket 时发生 I/O 异常 |
SecurityException | 如果安全管理器存在并且其 checkListen 方法不允许该操作。 |
MulticastSocket
public MulticastSocket(SocketAddress bindaddr) throws IOException
创建一个绑定到指定套接字地址的 MulticastSocket。
或者,如果地址为空,则创建一个未绑定的套接字。
如果有安全管理器,首先调用它的 checkListen 方法,并以 SocketAddress 端口作为其参数,以确保允许该操作。 这可能会导致 SecurityException。
创建套接字时,调用 DatagramSocket#setReuseAddress(boolean) 方法以启用 SO_REUSEADDR 套接字选项。
参数:
参数名称 | 参数描述 |
---|---|
bindaddr | 要绑定到的套接字地址,或者对于未绑定的套接字为 null。 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在创建 MulticastSocket 时发生 I/O 异常 |
SecurityException | 如果安全管理器存在并且其 checkListen 方法不允许该操作。 |
方法详情
setTTL
@Deprecated public void setTTL(byte ttl) throws IOException
已弃用。 改用 setTimeToLive 方法,该方法使用 int 而不是 byte 作为 ttl 的类型。
设置在此 MulticastSocket 上发送的多播数据包的默认生存时间,以控制多播的范围。
ttl 是一个无符号的 8 位量,因此必须在 0 <= ttl <= 0xFF 范围内。
参数:
参数名称 | 参数描述 |
---|---|
ttl | time-to-live |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在设置默认生存时间值时发生 I/O 异常 |
setTimeToLive
public void setTimeToLive(int ttl) throws IOException
设置在此 MulticastSocket 上发送的多播数据包的默认生存时间,以控制多播的范围。
ttl 必须在 0 <= ttl <= 255 范围内,否则将引发 IllegalArgumentException。 以 0 的 TTL 发送的组播数据包不会在网络上传输,但可以在本地传送。
参数:
参数名称 | 参数描述 |
---|---|
ttl | time-to-live |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在设置默认生存时间值时发生 I/O 异常 |
getTTL
@Deprecated public byte getTTL() throws IOException
已弃用。 改用 getTimeToLive 方法,它返回一个 int 而不是一个字节。
获取在套接字上发送的多播数据包的默认生存时间。
返回:
默认生存时间值
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在获取默认time-to-live值时发生 I/O 异常 |
getTimeToLive
public int getTimeToLive() throws IOException
获取在套接字上发送的多播数据包的默认time-to-live。
返回:
默认time-to-live值
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果在获取默认生存时间值时发生 I/O 异常 |
joinGroup
public void joinGroup(InetAddress mcastaddr) throws IOException
加入多播组。 它的行为可能会受到 setInterface 或 setNetworkInterface 的影响。
如果有安全管理器,则此方法首先调用其 checkMulticast 方法,并将 mcastaddr 参数作为其参数。
参数:
参数名称 | 参数描述 |
---|---|
mcastaddr | 是要加入的多播地址 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果加入错误或地址不是多播地址。 |
SecurityException | 如果存在安全管理器并且其 checkMulticast 方法不允许加入。 |
leaveGroup
public void leaveGroup(InetAddress mcastaddr) throws IOException
离开一个多播组。 它的行为可能会受到 setInterface 或 setNetworkInterface 的影响。
如果有安全管理器,则此方法首先调用其 checkMulticast 方法,并将 mcastaddr 参数作为其参数。
参数:
参数名称 | 参数描述 |
---|---|
mcastaddr | 是离开的组播地址 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果离开时出错或地址不是多播地址。 |
SecurityException | 如果存在安全管理器并且其 checkMulticast 方法不允许该操作。 |
joinGroup
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
在指定接口加入指定的组播组。
如果有安全管理器,则此方法首先调用其 checkMulticast 方法,并将 mcastaddr 参数作为其参数。
参数:
参数名称 | 参数描述 |
---|---|
mcastaddr | 是要加入的多播地址 |
netIf | 指定接收多播数据报包的本地接口,或 null 以遵循 MulticastSocket#setInterface(InetAddress) 或 MulticastSocket#setNetworkInterface(NetworkInterface) 设置的接口 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果加入错误或地址不是多播地址。 |
SecurityException | 如果存在安全管理器并且其 checkMulticast 方法不允许加入。 |
IllegalArgumentException | 如果 mcastaddr 为 null 或者是此套接字不支持的 SocketAddress 子类 |
leaveGroup
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
将组播组留在指定的本地接口上。
如果有安全管理器,则此方法首先调用其 checkMulticast 方法,并将 mcastaddr 参数作为其参数。
参数:
参数名称 | 参数描述 |
---|---|
mcastaddr | 是要离开的多播地址 |
netIf | 指定本地接口或 null 以遵循 MulticastSocket#setInterface(InetAddress) 或 MulticastSocket#setNetworkInterface(NetworkInterface) 设置的接口 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果离开时出错或地址不是多播地址。 |
SecurityException | 如果存在安全管理器并且其 checkMulticast 方法不允许该操作。 |
IllegalArgumentException | 如果 mcastaddr 为 null 或者是此套接字不支持的 SocketAddress 子类 |
setInterface
public void setInterface(InetAddress inf) throws SocketException
设置行为将受网络接口值影响的方法使用的多播网络接口。 对于多宿主主机很有用。
参数:
参数名称 | 参数描述 |
---|---|
inf | 网络地址 |
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果底层协议有错误,例如 TCP 错误。 |
getInterface
public InetAddress getInterface() throws SocketException
检索用于多播数据包的网络接口的地址。
返回:
InetAddress 表示用于多播数据包的网络接口的地址。
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果底层协议有错误,例如 TCP 错误。 |
setNetworkInterface
public void setNetworkInterface(NetworkInterface netIf) throws SocketException
指定在此套接字上发送的传出多播数据报的网络接口。
参数:
参数名称 | 参数描述 |
---|---|
netIf | 该接口 |
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果底层协议有错误,例如 TCP 错误。 |
getNetworkInterface
public NetworkInterface getNetworkInterface() throws SocketException
获取组播网络接口集。
返回:
当前设置的多播网络接口
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果底层协议有错误,例如 TCP 错误。 |
setLoopbackMode
public void setLoopbackMode(boolean disable) throws SocketException
禁用/启用多播数据报的本地环回 该选项被平台的网络代码用作设置多播数据是否将环回本地套接字的提示。
因为这个选项是一个提示,所以想要验证设置的环回模式的应用程序应该调用 getLoopbackMode()
参数:
参数名称 | 参数描述 |
---|---|
disable | true 禁用 LoopbackMode |
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果在设置值时发生错误 |
getLoopbackMode
public boolean getLoopbackMode() throws SocketException
获取组播数据报本地环回的设置。
返回:
如果 LoopbackMode 已被禁用,则为 true
Throws:
Throw名称 | Throw描述 |
---|---|
SocketException | 如果获取值时发生错误 |
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() 为真,则此方法以 p.getAddress() 和 ttl 作为其参数调用安全管理器的 checkMulticast 方法。如果该表达式的评估结果为假,则此方法将使用参数 p.getAddress().getHostAddress() 和 p.getPort() 调用安全管理器的 checkConnect 方法。如果不允许该操作,则对安全管理器方法的每次调用都可能导致 SecurityException。
参数:
参数名称 | 参数描述 |
---|---|
p | 是要发送的数据包。 数据包应包含目标多播 IP 地址和要发送的数据。 无需成为组的成员即可将数据包发送到目标多播地址。 |
ttl | 多播数据包的可选生存时间。 默认 ttl 为 1。 |
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生错误,即设置 ttl 时出错,则引发。 |
SecurityException | 如果存在安全管理器并且其 checkMulticast 或 checkConnect 方法不允许发送。 |