Многоадресная рассылка Java: Как проверить на локальном хосте? - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь реализовать приложение многоадресной рассылки на Java с использованием клиента и нескольких серверов. Клиент отправит дейтаграмму через MultiacastSocket, и все серверы, которые присоединились бы к группе, должны получить пакет. Затем все серверы должны что-то сделать и вернуть одноадресный ответ клиенту. Как это: enter image description here

Моя реализация выглядит так, что у клиента есть MulticastSocket, а у серверов только DatagramSockets. Большой вопрос для меня: как мне установить идентификатор группы серверов и номера портов, чтобы я мог проверить это локально? Я пытался использовать разные порты на клиенте и серверах и один и тот же идентификатор группы localhost, но это не работает. Также пробовал socket.setLoopbackMode() и socket.setInterface(InetAddress.getLoopbackAddress()). Но я застрял где-то, и какой-то конструктивный вклад был бы великолепен.

1 Ответ

0 голосов
/ 29 марта 2019

К сожалению, это зависит от платформы. Вы можете попробовать связать отправляющий и принимающий сокеты с интерфейсом обратной связи, но пробег будет отличаться Этот прием работает для Windows, немного в зависимости от того, как настроена ваша сеть. Я заставил его работать на SUSE Linux после ряда непонятных изменений параметров, но это было как минимум десять лет назад.

Интерфейс обратной связи является специальным (например, обычно более высокий MTU, чисто встроенный в программное обеспечение, исходящие сообщения перемещаются непосредственно во входящую очередь и т. Д.), Поэтому иногда обычные сетевые правила не применяются.

Одна вещь, которая будет работать равномерно на разных платформах, это использовать физическую сеть и накладывать ограничения на исходящий пакет. Для тестирования я обычно использую хитрость - установить TTL для исходящих пакетов на 1 (MulticastSocket.setTimeToLive(1);). Таким образом, пакет не сможет пройти ни один маршрутизатор. Кроме того, вам необходимо убедиться, что другие тесты, выполняемые в той же подсети, не мешают вашей. Для этой цели я обычно использую рандомизатор для многоадресного адреса, генерируя адрес между 224.1.1.1 и 239.254.254.254. Это адресное пространство должно быть достаточно большим, чтобы избежать коллизий. Вам также необходимо убедиться, что ваш рандомизатор избегает зарезервированных многоадресных адресов, иначе в вашей среде могут появиться всевозможные странные поведения.

Существует также MulticastSocket.setLoopbackMode(boolean), но я обнаружил, что он также зависит от платформы (хотя и не такой серьезный, как использование loopback, и, если честно, это было некоторое время назад, он мог бы работать лучше сейчас), поэтому некоторые может потребоваться настройка ОС.

...