【问题标题】:How to rejoin a multicast group in Java如何在 Java 中重新加入多播组
【发布时间】:2014-06-16 06:12:58
【问题描述】:

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

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

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

  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);

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

【问题讨论】:

    标签: java multicast multicastsocket


    【解决方案1】:

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

    【讨论】:

    • :-) 这正是我正在使用的策略。为了清晰和简洁,我只是把它从上面的代码中删除了。我即将开始嗅探数据包,但我怀疑后续的 IGMP 加入消息正在被终止,可能是因为我已经加入了一次组。
    • 嗯,昨晚测试的时候一定很累。重新加入正在工作。
    • 我认为离开和加入之间的睡眠可以有所作为。您可以想象,如果它们彼此跟随得太近,它们都可能会被“优化”掉。
    • 今晚开始发疯,因为它停止工作了。它决定将加入消息发送到另一个网络接口(我也有一个虚拟以太网适配器)。我现在知道如何定向到特定的适配器,但我认为它会发送到所有适配器。当有多个适配器时,是什么决定了它发送到哪个适配器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多