Как присоединиться к многоадресной группе в Java

У меня есть сценарий, в котором маршрутизатор может выйти из строя, когда мой многоадресный прослушиватель присоединяется к группе. В этом случае многоадресные сообщения никогда не достигнут слушателя.

Так что я планирую дать слушателю тайм-аут, а затем снова присоединиться к группе многоадресной рассылки.

Проблема в том, что следующий код не гарантирует, что прослушиватель успешно зарегистрируется и получит многоадресные сообщения.

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

Итак, что мне нужно сделать, чтобы прослушиватель перерегистрировался на маршрутизаторе?


person William    schedule 16.06.2014    source источник


Ответы (1)


Я бы попробовал другую стратегию. Я бы установил длительный тайм-аут чтения с setSoTimeout(), и если он истечет, я выйду из группы, немного посплю, а затем снова присоединюсь. Таким образом, это будет происходить каждый раз, а не только при запуске. Вероятно, вам нужно пронюхать сеть, чтобы убедиться, что сообщения IGMP JOIN действительно отправляются, когда вы выполняете повторное присоединение.

person user207421    schedule 16.06.2014
comment
:-) это именно та стратегия, которую я использую. Я просто исключил его из приведенного выше кода для ясности и краткости. Я собираюсь начать прослушивание пакетов, но подозреваю, что последующие сообщения о присоединении IGMP подавляются, возможно, потому, что я уже присоединился к группе однажды. - person William; 16.06.2014
comment
Хм, должно быть, я очень устал прошлой ночью, когда тестировал это. Повторное соединение работает. - person William; 16.06.2014
comment
Я думаю, что сон между уходом и присоединением может иметь значение. Вы можете себе представить, что если они слишком близко следуют друг за другом, они оба могут «оптимизироваться». - person user207421; 16.06.2014
comment
Сегодня вечером начал сходить с ума, потому что он перестал работать. Он решил отправить сообщения о присоединении к другому сетевому интерфейсу (у меня также есть виртуальный адаптер Ethernet). Теперь я знаю, как направить на конкретный адаптер, но я предполагал, что он будет отправлять на все адаптеры. Что определяет, на какой адаптер он отправляет данные, если их несколько? - person William; 17.06.2014