MulticastSocket中joinGroup()的目的

| 创建MulticastSocket之后,我正尝试加入多播组。 做类似的事情:
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));
为什么是这样? 谢谢!     
已邀请:
除非通过向本地网络交换机注册(使用发送IGMP消息的“ 2”方法)实现了错误的多播,然后该交换机会将所有发送到多播地址的数据包转发到已注册的每个设备。如果您不调用
joinGroup
,则不会发送任何组注册消息,本地交换机不知道您是否在乎消息,因此您实际上不会收到任何消息。 有些交换机在发送方面比其他交换机更为严格:我已经看到有些交换机可以在不注册的情况下将设备发送给多播组发送,但不能接收到多播组的数据包,并且我已经看到了其他交换机在其中存在设备注册以成功发送到多播组的其他成员或接收发送到多播组的数据包。     
我认为这是设计多播协议/ RFC的方式。 在调用\“ joinGroup \”之前,应用程序将忽略所有多播数据报。它是使应用程序接受数据包的“ joinGroup”。 在此处了解更多信息:http://tldp.org/HOWTO/Multicast-HOWTO-2.html 转到“加入组播组”部分。有关详细信息,请参见上面的链接。     
  当我使用接受一个MulticastSocket构造函数时   但是,将SocketAddress作为参数,   多播组未加入,并且   对joinGroup()的单独调用是   需要。 构造函数中的参数可以为null。因此,构造函数可能无法调用joinGroup。此外,该文件说,它仅具有约束力。 我认为不构造函数中调用joingGroup()只是Java中的标准好习惯。如果使用类构造函数,则用户将失去控制何时调用此方法的可能性。 他/她可能想要在加入该组之前准备数据结构,或者可能想要等待用户信号或其他过程完成。     
如果不使用组地址构造MulticastSocket,则必须以其他方式加入该组。否则,您为什么要收到该组的任何消息? 注意,使用组地址构造的NB并非在所有平台AFAIK上均有效。实际上,指定使用SocketAddress的构造函数将其用作本地绑定地址,而不是多播组。我相信指定组地址在Linux上确实有效,但在某些其他平台上则无效。我将以记录方式使用它,并显式调用joinGroup()。请注意,在多宿主主机上,您可能需要为每个可用的NIC调用joinGroup()。     
Femi是正确的:您需要致电ѭ4来通知您的网络,您有兴趣接收该多播组的数据包。 (请记住,所有IP通信都是广播通信;这就是why5ѭ和其他“混杂”程序起作用的原因。) 使用IP地址的构造函数没有指定要加入的组:而是指定要使用的网卡。如果您未指定卡本身的IP地址,那么您正在请求将消息路由到您指定地址的卡。 (哇,这有很多规定。)因此,之后您仍然需要
joinGroup()
。只是只有您...指示的卡才会收到数据包。     

要回复问题请先登录注册