Насколько я понимаю, поставщик услуг имеет интерфейсы в нескольких различных сетях. Каждый клиент находится только в одной из этих сетей и, следовательно, может общаться только с одним из интерфейсов. Служба должна выяснить, какой из интерфейсов доступен клиенту, чтобы он мог отправить правильный адрес. Вы (разработчик службы) не можете контролировать сетевую среду, в которой развернута служба, и, следовательно, не можете использовать решения сетевого уровня, такие как DNS.
Во многих сетевых настройках маршрутизация симметрична. То есть маршрут от хоста A к хосту B такой же, как и от хоста B к хосту A. Если вы знаете, что это происходит во всех средах, в которых будет развернут ваш сервис, то вы можете смело предположить, что использованный адрес подключиться к клиенту доступно клиенту. Этот адрес может быть обнаружен, например, путем подключения DatagramSocket
к клиенту и последующего вызова его getLocalAddress()
метода.
Если маршрутизация асимметрична, я не знаю способа определить, доступен ли конкретный интерфейс клиенту, используя только java.net
API. Если вы управляете реализацией клиента, возможно, вы сможете включить в него широковещательный адрес источника (который должен быть видимым для него интерфейсом сервера) в свой пакет широковещательного ответа. Кроме того, вы не включили достаточно информации о сценарии, чтобы дать конкретный совет. Например, было бы полезно узнать, какой протокол используется для широковещательной рекламы и ответа клиента на нее.