Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MulticastSocket中joinGroup()的用途_Java_Sockets_Multicast - Fatal编程技术网

Java MulticastSocket中joinGroup()的用途

Java MulticastSocket中joinGroup()的用途,java,sockets,multicast,Java,Sockets,Multicast,我正在尝试在创建多播套接字后加入多播组 做一些类似于: MulticastSocket mySocket = new MulticastSocket(4444); mySocket.joinGroup(InetAddress.getByName("230.0.0.1")); // as an example 很好。但是,当我使用接受SocketAddress作为参数的MulticastSocket构造函数时,多播组没有加入,需要对joinGroup()进行单独调用 MulticastSocke

我正在尝试在创建多播套接字后加入多播组

做一些类似于:

MulticastSocket mySocket = new MulticastSocket(4444);
mySocket.joinGroup(InetAddress.getByName("230.0.0.1")); // as an example
很好。但是,当我使用接受SocketAddress作为参数的MulticastSocket构造函数时,多播组没有加入,需要对joinGroup()进行单独调用

MulticastSocket mySocket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));
为什么会这样


谢谢

我认为这就是多播协议/RFC的设计方式。 在调用“joinGroup”之前,应用程序将忽略所有多播数据报。正是“joinGroup”使应用程序接受数据包

请在此处阅读更多信息:


转到加入多播组的部分。在上面的链接中了解具体细节。

我认为这就是多播协议/RFC的设计方式。 在调用“joinGroup”之前,应用程序将忽略所有多播数据报。正是“joinGroup”使应用程序接受数据包

请在此处阅读更多信息:


转到加入多播组部分。在上面的链接中了解具体细节。

除非我错了,否则通过向本地网络交换机注册多播来实现(使用发送IGMP消息的
joinGroup
方法)然后,交换机将发送到多播地址的所有数据包转发到每个已注册的设备。如果不调用
joinGroup
,则不会发送任何组注册消息,本地交换机不会提示您关心这些消息,因此您实际上不会收到任何消息


有些交换机在发送方面比其他交换机更严格:我见过一些交换机,其中设备可以发送到多播组而无需注册,但不能接收到多播组的数据包,我还见过其他交换机,设备必须注册才能成功发送到多播组的其他成员或接收发送到多播组的数据包。

除非我错了,否则通过注册本地网络交换机实现多播(使用发送IGMP消息的
joinGroup
方法)然后,交换机将发送到多播地址的所有数据包转发到每个已注册的设备。如果不调用
joinGroup
,则不会发送任何组注册消息,本地交换机不会提示您关心这些消息,因此您实际上不会收到任何消息


有些交换机在发送方面比其他交换机更严格:我见过一些交换机,其中设备可以发送到多播组而无需注册,但不能接收到多播组的数据包,我还见过其他交换机,设备必须注册才能成功发送到多播组的其他成员或接收发送到多播组的数据包。

如果不使用组地址构建多播套接字,则必须以其他方式加入组。否则,您为什么要接收该组的任何消息


NB使用组地址构造并不适用于AFAIK的所有平台。事实上,指定采用SocketAddress的构造函数将其用作本地绑定地址,而不是多播组。我相信指定组地址在Linux上确实有效,但在其他一些平台上不起作用。我将以文档化的方式使用它,并显式调用joinGroup()。请注意,在多宿主主机上,可能需要为每个可用NIC调用joinGroup()。

如果不使用组地址构造多播套接字,则必须以其他方式加入组。否则,您为什么要接收该组的任何消息

NB使用组地址构造并不适用于AFAIK的所有平台。事实上,指定采用SocketAddress的构造函数将其用作本地绑定地址,而不是多播组。我相信指定组地址在Linux上确实有效,但在其他一些平台上不起作用。我将以文档化的方式使用它,并显式调用joinGroup()。请注意,在多主机主机上,可能需要为每个可用NIC调用joinGroup()

当我使用接受 SocketAddress作为参数, 多播组未加入,无法继续 对joinGroup()的单独调用是 必需的

MulticastSocket mySocket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));
构造函数中的参数可以为null。因此,构造函数可能无法调用joinGroup。此外,该文件称其仅具有约束力

我认为在构造函数中不调用joingGroup()只是Java中的标准良好实践。如果类构造函数这样做了,那么用户将无法控制调用此方法的时间

他/她可能希望在加入组之前准备好数据结构,或者可能希望等待用户信号或其他过程完成

当我使用接受 SocketAddress作为参数, 多播组未加入,无法继续 对joinGroup()的单独调用是 必需的

MulticastSocket mySocket = new MulticastSocket(new InetSocketAddress("230.0.0.1", 4444));
构造函数中的参数可以为null。因此,构造函数可能无法调用joinGroup。此外,该文件称其仅具有约束力

我认为在构造函数中不调用joingGroup()只是Java中的标准良好实践。如果类构造函数这样做了,那么用户将无法控制调用此方法的时间


他/她可能希望在加入组之前准备好数据结构,也可能希望等待用户信号或其他过程完成。

Femi是正确的:您需要调用
joinGroup()
通知您的网络您有兴趣接收该多播组的数据包。(请记住,所有的IP流量都是广播流量;这就是为什么
Wireshark
和其他“杂乱”程序可以工作的原因。)

获取IP地址的构造函数没有指定要加入的组:它指定要使用的网卡。如果未指定卡本身的IP地址,则请求将消息路由到指定地址的卡。