public class MulticastSocket extends 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可以同时订阅组播组和端口,并且它们都将接收组数据报。
目前applet不允许使用组播套接字。
Constructor and Description |
---|
MulticastSocket()
创建组播套接字。
|
MulticastSocket(int port)
创建组播套接字并将其绑定到特定端口。
|
MulticastSocket(SocketAddress bindaddr)
创建一个绑定到指定套接字地址的MulticastSocket。
|
Modifier and Type | Method and Description |
---|---|
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的类型。
|
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
public MulticastSocket() throws IOException
如果有一个安全管理器,它的checkListen
方法首先被调用,其中0为参数,以确保操作是允许的。 这可能会导致SecurityException。
当创建套接字时,调用DatagramSocket.setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。
IOException
- 如果在创建MulticastSocket时发生I / O异常
SecurityException
- 如果存在安全管理员,并且其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
,
DatagramSocket.setReuseAddress(boolean)
public MulticastSocket(int port) throws IOException
如果有一个安全管理器,它的checkListen
方法首先被调用,以port
参数作为参数,以确保允许操作。 这可能会导致SecurityException。
当创建套接字时,调用DatagramSocket.setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。
port
- 要使用的端口
IOException
- 如果在创建MulticastSocket时发生I / O异常
SecurityException
- 如果安全管理器存在,并且其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
,
DatagramSocket.setReuseAddress(boolean)
public MulticastSocket(SocketAddress bindaddr) throws IOException
或者,如果地址为null
,请创建未绑定的套接字。
如果有一个安全管理器,它的checkListen
方法首先被调用SocketAddress端口作为参数,以确保该操作被允许。 这可能会导致SecurityException。
当创建套接字时,调用DatagramSocket.setReuseAddress(boolean)
方法来启用SO_REUSEADDR套接字选项。
bindaddr
- 要绑定的套接字地址,或未绑定套接字的
null
。
IOException
- 如果在创建MulticastSocket时发生I / O异常
SecurityException
- 如果安全管理器存在,并且其
checkListen
方法不允许操作。
SecurityManager.checkListen(int)
,
DatagramSocket.setReuseAddress(boolean)
@Deprecated public void setTTL(byte ttl) throws IOException
MulticastSocket
,以控制多播的范围。
ttl是一个无符号的 8位数,因此必须在0 <= ttl <= 0xFF
范围内。
ttl
- 生存时间
IOException
- 如果在设置默认生存时间值时发生I / O异常
getTTL()
public void setTimeToLive(int ttl) throws IOException
MulticastSocket
,以控制多播的范围。
ttl 必须在0 <= ttl <= 255
范围内或IllegalArgumentException
将被抛出。 发送TTL为0
播报文不在网络上传输,但可能在本地传送。
ttl
- 生存时间
IOException
- 如果在设置默认生存时间值时发生I / O异常
getTimeToLive()
@Deprecated public byte getTTL() throws IOException
IOException
- 如果在获取默认生存时间值时发生I / O异常
setTTL(byte)
public int getTimeToLive() throws IOException
IOException
- 如果在获取默认生存时间值时发生I / O异常
setTimeToLive(int)
public void joinGroup(InetAddress mcastaddr) throws IOException
setInterface
或setNetworkInterface
影响。
如果有安全管理器,则该方法首先调用其checkMulticast
方法,其参数为mcastaddr
。
mcastaddr
- 是要加入的组播地址
IOException
- 如果加入错误或地址不是多播地址。
SecurityException
- 如果存在安全管理员,并且其
checkMulticast
方法不允许连接。
SecurityManager.checkMulticast(InetAddress)
public void leaveGroup(InetAddress mcastaddr) throws IOException
setInterface
或setNetworkInterface
影响。
如果有安全管理员,则该方法首先调用其checkMulticast
方法,其参数为mcastaddr
。
mcastaddr
- 是要离开的组播地址
IOException
- 如果出现错误或地址不是多播地址。
SecurityException
- 如果存在安全管理员,并且其
checkMulticast
方法不允许操作。
SecurityManager.checkMulticast(InetAddress)
public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
如果有一个安全管理器,这个方法首先调用它的checkMulticast
方法,其中mcastaddr
参数作为参数。
mcastaddr
- 是要加入的组播地址
netIf
- 指定接收组播数据报包的本地接口,否则为
null延迟到
setInterface(InetAddress)
或
setNetworkInterface(NetworkInterface)
设置的
接口
IOException
- 如果加入错误或地址不是组播地址。
SecurityException
- 如果存在安全管理员,并且其
checkMulticast
方法不允许连接。
IllegalArgumentException
- 如果mcastaddr为null或是此套接字不支持的SocketAddress子类
SecurityManager.checkMulticast(InetAddress)
public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException
如果有一个安全管理器,这个方法首先调用它的checkMulticast
方法用mcastaddr
参数作为其参数。
mcastaddr
- 是要离开的组播地址
netIf
- 指定本地接口或
空值延迟到
setInterface(InetAddress)
或
setNetworkInterface(NetworkInterface)
设置的
接口
IOException
- 如果出现错误或地址不是组播地址。
SecurityException
- 如果安全管理器存在,并且其
checkMulticast
方法不允许操作。
IllegalArgumentException
- 如果mcastaddr为null或是此套接字不支持的SocketAddress子类
SecurityManager.checkMulticast(InetAddress)
public void setInterface(InetAddress inf) throws SocketException
inf
- InetAddress
SocketException
- 如果底层协议有错误,如TCP错误。
getInterface()
public InetAddress getInterface() throws SocketException
InetAddress
表示用于组播数据包的网络接口的地址。
SocketException
- 如果底层协议有错误,如TCP错误。
setInterface(java.net.InetAddress)
public void setNetworkInterface(NetworkInterface netIf) throws SocketException
netIf
- 界面
SocketException
- 如果底层协议有错误,如TCP错误。
getNetworkInterface()
public NetworkInterface getNetworkInterface() throws SocketException
NetworkInterface
SocketException
- 如果底层协议有错误,如TCP错误。
setNetworkInterface(NetworkInterface)
public void setLoopbackMode(boolean disable) throws SocketException
因为这个选项是一个提示,想要验证什么环回模式设置的应用程序应该调用getLoopbackMode()
disable
-
true
以禁用LoopbackMode
SocketException
- 如果在设置值时发生错误
getLoopbackMode()
public boolean getLoopbackMode() throws SocketException
SocketException
- 获取该值时是否发生错误
setLoopbackMode(boolean)
@Deprecated public void send(DatagramPacket p, byte ttl) throws IOException
setInterface
影响。
如果有安全管理器,则该方法首先执行一些安全检查。 首先,如果p.getAddress().isMulticastAddress()
是真的,此方法调用安全管理器的checkMulticast
法p.getAddress()
和ttl
作为参数。 如果该表达式的评估为false,则该方法会调用安全性管理器的checkConnect
方法,其参数为p.getAddress().getHostAddress()
和p.getPort()
。 每次调用安全管理器方法都可能导致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)