阅读(888) (0)

鸿蒙OS MulticastSocket

2022-06-06 16:30:28 更新

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 方法不允许发送。