public class MulticastSocket
extends DatagramSocket
java.lang.Object | ||
↳ | java.net.DatagramSocket | |
↳ | java.net.MulticastSocket |
多播数据报套接字类对发送和接收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);When one sends a message to a multicast group, all subscribing recipients to that host and port receive the message (within the time-to-live range of the packet, see below). The socket needn't be a member of the multicast group to send messages to it.
当一个套接字订阅一个多播组/端口时,它接收其他主机发送给该组/端口的数据报,就像该组和端口的所有其他成员一样。 套接字通过leaveGroup(InetAddress addr)方法放弃组中的成员资格。 多个MulticastSocket可以同时订阅多播组和端口,并且它们都将接收组数据报。
目前小应用程序不允许使用多播套接字。
Public constructors |
|
---|---|
MulticastSocket() 创建一个多播套接字。 |
|
MulticastSocket(int port) 创建一个多播套接字并将其绑定到特定端口。 |
|
MulticastSocket(SocketAddress bindaddr) 创建绑定到指定套接字地址的MulticastSocket。 |
Public methods |
|
---|---|
InetAddress |
getInterface() 检索用于多播数据包的网络接口的地址。 |
boolean |
getLoopbackMode() 获取多播数据报本地回送的设置。 |
NetworkInterface |
getNetworkInterface() 获取多播网络接口集。 |
byte |
getTTL() 此方法在API级别1中已弃用。请改用getTimeToLive方法,它将返回int而不是字节 。 |
int |
getTimeToLive() 获取套接字上发送的多播数据包的默认生存时间。 |
void |
joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) 在指定的接口上加入指定的组播组。 |
void |
joinGroup(InetAddress mcastaddr) 加入多播组。 |
void |
leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) 在指定的本地接口上保留多播组。 |
void |
leaveGroup(InetAddress mcastaddr) 保留一个多播组。 |
void |
send(DatagramPacket p, byte ttl) 此方法在API级别1中已弃用。请使用以下代码或其替代方法:...... 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 |
setTTL(byte ttl) 此方法在API级别1中已弃用。请改用setTimeToLive方法,它使用int而不是byte作为ttl的类型。 |
void |
setTimeToLive(int ttl) 设置此 |
Inherited methods |
|
---|---|
From class java.net.DatagramSocket
|
|
From class java.lang.Object
|
|
From interface java.io.Closeable
|
|
From interface java.lang.AutoCloseable
|
MulticastSocket ()
创建一个多播套接字。
如果有安全管理器,则首先使用0作为其参数调用其方法checkListen
,以确保允许操作。 这可能会导致SecurityException。
当创建套接字时,会调用 setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。
Throws | |
---|---|
IOException |
if an I/O exception occurs while creating the MulticastSocket |
SecurityException |
if a security manager exists and its checkListen method doesn't allow the operation. |
MulticastSocket (int port)
创建一个多播套接字并将其绑定到特定端口。
如果有安全管理器,则首先使用port
参数作为其参数来调用其checkListen
方法,以确保允许操作。 这可能会导致SecurityException。
当创建套接字时,会调用 setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。
Parameters | |
---|---|
port |
int : port to use |
Throws | |
---|---|
IOException |
if an I/O exception occurs while creating the MulticastSocket |
SecurityException |
if a security manager exists and its checkListen method doesn't allow the operation. |
MulticastSocket (SocketAddress bindaddr)
创建绑定到指定套接字地址的MulticastSocket。
或者,如果地址是 null
,则创建一个未绑定的套接字。
如果有安全管理器,则首先使用SocketAddress端口作为其参数调用其checkListen
方法,以确保允许操作。 这可能会导致SecurityException。
当创建套接字时,会调用 setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。
Parameters | |
---|---|
bindaddr |
SocketAddress : Socket address to bind to, or null for an unbound socket. |
Throws | |
---|---|
IOException |
if an I/O exception occurs while creating the MulticastSocket |
SecurityException |
if a security manager exists and its checkListen method doesn't allow the operation. |
InetAddress getInterface ()
检索用于多播数据包的网络接口的地址。
Returns | |
---|---|
InetAddress |
An InetAddress representing the address of the network interface used for multicast packets. |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
boolean getLoopbackMode ()
获取多播数据报本地回送的设置。
Returns | |
---|---|
boolean |
true if the LoopbackMode has been disabled |
Throws | |
---|---|
SocketException |
if an error occurs while getting the value |
也可以看看:
NetworkInterface getNetworkInterface ()
获取多播网络接口集。
Returns | |
---|---|
NetworkInterface |
the multicast NetworkInterface currently set |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
byte getTTL ()
此方法在API级别1中已弃用。
相反,使用getTimeToLive方法,它返回一个int而不是一个字节 。
获取套接字上发送的多播数据包的默认生存时间。
Returns | |
---|---|
byte |
the default time-to-live value |
Throws | |
---|---|
IOException |
if an I/O exception occurs while getting the default time-to-live value |
也可以看看:
int getTimeToLive ()
获取套接字上发送的多播数据包的默认生存时间。
Returns | |
---|---|
int |
the default time-to-live value |
Throws | |
---|---|
IOException |
if an I/O exception occurs while getting the default time-to-live value |
也可以看看:
void joinGroup (SocketAddress mcastaddr, NetworkInterface netIf)
在指定的接口上加入指定的组播组。
如果有安全管理器,则此方法首先使用 mcastaddr
参数作为其参数调用其 checkMulticast
方法。
Parameters | |
---|---|
mcastaddr |
SocketAddress : is the multicast address to join |
netIf |
NetworkInterface : specifies the local interface to receive multicast datagram packets, or null to defer to the interface set by setInterface(InetAddress) or setNetworkInterface(NetworkInterface) |
Throws | |
---|---|
IOException |
if there is an error joining or when the address is not a multicast address. |
SecurityException |
if a security manager exists and its checkMulticast method doesn't allow the join. |
IllegalArgumentException |
if mcastaddr is null or is a SocketAddress subclass not supported by this socket |
也可以看看:
void joinGroup (InetAddress mcastaddr)
加入多播组。 其行为可能受到setInterface
或setNetworkInterface
影响。
如果有安全管理器,则此方法首先使用 mcastaddr
参数作为其参数调用其 checkMulticast
方法。
Parameters | |
---|---|
mcastaddr |
InetAddress : is the multicast address to join |
Throws | |
---|---|
IOException |
if there is an error joining or when the address is not a multicast address. |
SecurityException |
if a security manager exists and its checkMulticast method doesn't allow the join. |
也可以看看:
void leaveGroup (SocketAddress mcastaddr, NetworkInterface netIf)
在指定的本地接口上保留多播组。
如果有安全管理器,则此方法首先使用 mcastaddr
参数作为其参数来调用其 checkMulticast
方法。
Parameters | |
---|---|
mcastaddr |
SocketAddress : is the multicast address to leave |
netIf |
NetworkInterface : specifies the local interface or null to defer to the interface set by setInterface(InetAddress) or setNetworkInterface(NetworkInterface) |
Throws | |
---|---|
IOException |
if there is an error leaving or when the address is not a multicast address. |
SecurityException |
if a security manager exists and its checkMulticast method doesn't allow the operation. |
IllegalArgumentException |
if mcastaddr is null or is a SocketAddress subclass not supported by this socket |
也可以看看:
void leaveGroup (InetAddress mcastaddr)
保留一个多播组。 其行为可能受到setInterface
或setNetworkInterface
影响。
如果有安全管理器,此方法首先调用其 checkMulticast
方法与 mcastaddr
作为参数来。
Parameters | |
---|---|
mcastaddr |
InetAddress : is the multicast address to leave |
Throws | |
---|---|
IOException |
if there is an error leaving or when the address is not a multicast address. |
SecurityException |
if a security manager exists and its checkMulticast method doesn't allow the operation. |
也可以看看:
void send (DatagramPacket p, byte ttl)
此方法在API级别1中已弃用。
使用下面的代码或其等效代替:...... 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
方法。 如果对该表达式的评估为false,则此方法改为调用带有参数p.getAddress().getHostAddress()
和p.getPort()
的安全管理器的checkConnect
方法。 如果操作不被允许,每次调用安全管理器方法都可能导致SecurityException。
Parameters | |
---|---|
p |
DatagramPacket : is the packet to be sent. The packet should contain the destination multicast ip address and the data to be sent. One does not need to be the member of the group to send packets to a destination multicast address. |
ttl |
byte : optional time to live for multicast packet. default ttl is 1. |
Throws | |
---|---|
IOException |
is raised if an error occurs i.e error while setting ttl. |
SecurityException |
if a security manager exists and its checkMulticast or checkConnect method doesn't allow the send. |
void setInterface (InetAddress inf)
设置其行为受网络接口值影响的方法所使用的多播网络接口。 对于多宿主主机很有用。
Parameters | |
---|---|
inf |
InetAddress : the InetAddress |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
void setLoopbackMode (boolean disable)
禁用/启用多播数据报的本地回送该选项由平台的网络代码用作设置多播数据是否将循环回本地套接字的提示。
因为这个选项是一个提示,所以想验证什么环回模式设置的应用程序应该调用 getLoopbackMode()
Parameters | |
---|---|
disable |
boolean : true to disable the LoopbackMode |
Throws | |
---|---|
SocketException |
if an error occurs while setting the value |
也可以看看:
void setNetworkInterface (NetworkInterface netIf)
指定在此套接字上发送的传出多播数据报的网络接口。
Parameters | |
---|---|
netIf |
NetworkInterface : the interface |
Throws | |
---|---|
SocketException |
if there is an error in the underlying protocol, such as a TCP error. |
也可以看看:
void setTTL (byte ttl)
此方法在API级别1中已弃用。
相反,使用setTimeToLive方法,它使用int而不是byte作为ttl的类型。
设置在此 MulticastSocket
上发出的多播数据包的默认生存时间,以控制多播的范围。
ttl是一个 无符号的 8位数量,因此 必须在 0 <= ttl <= 0xFF
的范围内。
Parameters | |
---|---|
ttl |
byte : the time-to-live |
Throws | |
---|---|
IOException |
if an I/O exception occurs while setting the default time-to-live value |
也可以看看:
void setTimeToLive (int ttl)
设置此 MulticastSocket
发出的多播数据包的默认生存时间以控制多播的范围。
ttl 必须在0 <= ttl <= 255
范围内, IllegalArgumentException
将抛出IllegalArgumentException
。 以0
的TTL发送的组播数据包不在网络上传输,但可以在本地传送。
Parameters | |
---|---|
ttl |
int : the time-to-live |
Throws | |
---|---|
IOException |
if an I/O exception occurs while setting the default time-to-live value |
也可以看看: