Обнаружение сети в Java с использованием многоадресной рассылки
Я пытаюсь создать клиентское/серверное Java-приложение. Оба клиента и сервер будут работать в одной и той же сети Wi-Fi. Сервер будет работать на определенном порту, о котором знает клиент.
Я планирую отправить многоадресное сообщение от клиента через сеть для этого конкретного порта, чтобы обнаружить сервер. Тем не менее, я не слишком уверен, как я могу узнать, какой IP-адрес в моей сети получил мое сообщение.
Нужно ли создавать сокет на клиенте и прослушивать входящие пакеты, как только я отправляю свое многоадресное сообщение в случае ответа сервера на сервер?
Спасибо заранее.
Ответы
Ответ 1
(1) сервер прослушивает предварительно настроенный порт
DatagramSocket s = new DatagramSocket(8888);
s.receive //(1)
s.send //(2)
(3) клиент отправляет сообщение на порт в широковещательном IP-адресе 255.255.255.255
DatagramSocket c = new DatagramSocket();
c.send(255.255.255.255:8888,msg) //(3)
c.receive //(4)
клиент также привязывается к порту. мы не указали его, поэтому оно выбрано для нас случайно.
(3) передаст сообщение всем локальным машинам, сервер (1) получит сообщение с IP-адресом клиента.
(2) сервер отправляет ответное сообщение клиенту IP: порт
(4) клиент получает сообщение ответа от сервера.
Ответ 2
Я бы настоятельно рекомендовал использовать JGroups. Он имеет множество функций, и он будет делать все UDP-материалы. JBoss использует его для кластеризации.
Ответ 3
Вы можете попробовать использовать java.net.MulticastSocket
(доступный с версии Java 1.1). Если вам не нужны богатые наборы функций libs, такие как jgroups, hazelcast и т.д., что простой Java API может служить вам достаточно хорошо.
См. Также примеры страниц здесь и здесь.
Ответ 4
Вы можете попробовать использовать SSDP. Это то, что UPnP-устройства используют для обнаружения друг друга. Это многоадресная рассылка на порт 1900 и просто использует действительно простые пакеты для отправки IP-адресов и служебной информации.
Cling - это UPnP lib, из которого вы можете извлечь. Примечание. Я не рекомендую вам переходить на UPnP - только протокол обнаружения.