1

我有一个场景,当我的多播侦听器加入组时,路由器可能会关闭。在那种情况下,多播消息将永远不会到达侦听器。

所以我打算让监听器超时,然后重新加入多播组。

问题是下面的代码并不能保证监听器成功注册并接收到多播消息。

  final MulticastSocket mcSocket = new MulticastSocket(POR); 

  // Join group before router started
  mcSocket.joingGroup(mcAddress);

  // wait until router starts
  Thread.sleep(LONG_TIME);

  mcSocket.leaveGroup(mcAddress);

  // Join group after router started.
  // Expected that this would re-register listener with router, but it doesn't
  mcSocket.joingGroup(mcAddress);

  // packet is never received
  mcSocket.receive(packet);

那么,我需要做些什么来确保侦听器重新注册到路由器?

4

1 回答 1

1

我会尝试不同的策略。我会设置一个较长的读取超时,setSoTimeout()如果超时,我会离开组,睡一会儿,然后重新加入。这样它每次都会发生,而不仅仅是在启动时。您可能需要嗅探网络以确保在您重新加入时 IGMP JOIN 消息实际上正在发出。

于 2014-06-16T06:32:28.070 回答