11

Próbuję włączyć wykrywanie usług w mojej aplikacji klient-serwer przy użyciu JmDNS. W pełni rozumiem rejestru usług po stronie serwera, z kodem, który przypomina to:Wykrywanie usług JmDNS w klient-serwer

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

Jednak mam problemy zastanawianie się, jak mój klient ma odzyskać numer portu i adres IP z zarejestrowanego obsługi i użytkowania te dane, aby otworzyć połączenie TCP. Szukałem przykłady, jak korzystać z JmDNS, ale bez skutku. Czy ktoś może podać mi kilka podstawowych przykładów? Lub czy ktoś ma jakieś linki do dobrych zasobów/samouczków na JmDNS, czy mógłby je podać?

Uwaga: JmDNS jest koniecznością tutaj, więc chciałbym docenić odpowiedzi odnoszące się tylko do JmDNS i nie oferujące alternatywy. Ponadto obszernie przyjrzałem się interfejsowi API JmDNS i nadal nie mogę tego zrozumieć, więc nie publikuj linku do dokumentów jako zasobu.

Dzięki.

Odpowiedz

20

po stronie serwera:

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

po stronie klienta:

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

Gdy masz URL http://192.168.11.2:6666/myTestService można analizować/używać go otworzyć połączenie z gniazdem. Mam nadzieję, że ta pomoc.

+0

Dzięki, to naprawdę sprawia, że ​​rzeczy są dla mnie bardziej przejrzyste. Będąc całkowicie obeznany z wywołania zwrotnego w Javie (lub w jakimkolwiek języku, o to chodzi), w jaki sposób chciałbym pobrać informacje o usługach z wywołania zwrotnego w przeciwieństwie do ServiceInfo []? Czy jest to tylko kwestia deklarowania ciągu serviceUrl poza implementacją serviceListener, więc mogę uzyskać do niego dostęp globalnie? –

+0

Tak, zwykle zdefiniuj ServiceListener jako wewnętrzną klasę i zdefiniuj serviceUrl jako zmienną instancji klasy zewnętrznej. – yorkw

+0

@yorkw Czy istnieje szansa na rozszerzenie przykładowego kodu, aby pokazać, jak go przeanalizować i otworzyć gniazdo? Nie mogę znaleźć właściwego kodu połączenia po stronie klienta. – Radu

Powiązane problemy