Module java.base
Package java.net

Class MulticastSocket

java.lang.Object
java.net.DatagramSocket
java.net.MulticastSocket
所有已实现的接口:
Closeable, AutoCloseable

public class MulticastSocket extends DatagramSocket
MulticastSocket是一个数据报套接字,方便发送和接收IP多播数据报。 MulticastSocket构造函数创建一个带有适当套接字选项的套接字,使其适合接收多播数据报。 MulticastSocket类还定义了方便的设置器和获取器方法,用于常用于多播应用程序的套接字选项。

加入一个或多个多播组可以接收发送到这些组的多播数据报。

IPv4多播组由一个D类IP地址和一个标准UDP端口号指定。 D类IP地址的范围是224.0.0.0239.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可以同时订阅一个多播组和端口,并且它们都将接收组数据报。

DatagramSocketMulticastSocket类定义了方便的方法来设置和获取几个套接字选项。与DatagramSocket类似,此类还支持setOptiongetOption方法来设置和查询套接字选项。支持的套接字选项集在DatagramSocket中定义。还可能支持其他(特定于实现的)选项。

API注释:
DatagramSocket可以直接用于发送和接收多播数据报。 DatagramChannel实现了MulticastChannel接口,并提供了一个用于发送和接收多播数据报的替代API。 MulticastChannel API支持任意源特定源多播。考虑使用DatagramChannel进行多播。
自版本:
1.1