Обнаружение службы JmDNS в клиент-сервере

Я пытаюсь включить обнаружение службы в своем клиент-серверном приложении с помощью JmDNS. Я полностью понимаю реестр служб на стороне сервера, с кодом, который напоминает это:

JmDNS jmdns = JmDNS.create(localhost);
jmdns.register(serviceInfo);

Однако у меня возникли проблемы с выяснением того, как мой клиент получает номер порта и IP-адрес из зарегистрированной службы и использует эти данные для открытия TCP-соединения. Я искал примеры использования JmDNS, но безрезультатно. Может ли кто-нибудь здесь дать мне несколько простых примеров? Или, если у кого есть какие-либо ссылки на хорошие ресурсы/учебники на JmDNS, они могли бы предоставить их?

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

Спасибо.

Ответ 1

Серверная сторона:

mdnsServer = JmDNS.create(localhost);
// Register a test service.
ServiceInfo testService = ServiceInfo.create("my-service-type", "Test Service", 6666, "test service");
mdnsServer.registerService(testService);

Клиентская сторона:

private ServiceListener mdnsServiceListener = new ServiceListener() {
  public void serviceAdded(ServiceEvent serviceEvent) {
    // Test service is discovered. requestServiceInfo() will trigger serviceResolved() callback.
    mdnsService.requestServiceInfo(Constants.mdnsServiceType, serviceEvent.getName());
  }

  public void serviceRemoved(ServiceEvent serviceEvent) {
    // Test service is disappeared.
  }

  public void serviceResolved(ServiceEvent serviceEvent) {
    // Test service info is resolved.
    String serviceUrl = serviceEvent.getInfo().getURL();
    // serviceURL is usually something like http://192.168.11.2:6666/my-service-name
};

mdnsService = JmDNS.create();
mdnsService.addServiceListener("my-service-type", mdnsServiceListener);
ServiceInfo[] infos = mdnsService.list(Constants.mdnsServiceType);

// Retrieve service info from either ServiceInfo[] returned here or listener callback method above.
mdnsService.removeServiceListener("my-service-type", mdnsServiceListener);
mdnsService.close();

Как только у вас есть URL http://192.168.11.2:6666/myTestService, вы можете разобрать/использовать его для открытия сокета. Надеюсь, что поможет.