11

Sto tentando di abilitare il rilevamento dei servizi nell'applicazione client-server utilizzando JmDNS. Capisco perfettamente registro di servizio sul lato server, con il codice che assomiglia a questo:Rilevamento del servizio JmDNS nel client-server

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

Tuttavia, sto avendo difficoltà a capire come avere il mio cliente recuperare il numero di porta e l'indirizzo IP dal servizio registrato e l'uso questi dati per aprire una connessione TCP. Ho cercato esempi su come usare JmDNS ma senza risultato. Qualcuno può darmi qualche esempio di base? O se qualcuno ha dei link a buone risorse/tutorial su JmDNS, potrebbe fornirli per favore?

Nota: JmDNS è una necessità qui, quindi vorrei apprezzare le risposte relative solo a JmDNS e non offrendo un'alternativa. Inoltre, ho esaminato l'API JmDNS in modo estensivo e non riesco ancora a capirlo, quindi per favore non pubblicare un link ai documenti come risorsa.

Grazie. Lato server

risposta

20

:

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

lato client:

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

Una volta che hai l'URL http://192.168.11.2:6666/myTestService, è in grado di analizzare/usarlo connessione socket aperto. Spero che aiuto.

+0

Grazie, questo rende davvero le cose molto più chiare per me. Essere completamente estraneo ai callback in Java (o in qualsiasi lingua, se è per questo) come farei per recuperare le informazioni sul servizio dal callback in opposizione al ServiceInfo []? È solo questione di dichiarare la stringa serviceUrl al di fuori della implementazione del serviceListener in modo che possa accedervi globalmente? –

+0

Sì, di solito definisce ServiceListener come una classe interna e definisce serviceUrl come variabile di istanza della classe esterna. – yorkw

+0

@yorkw Qualche possibilità di espandere l'esempio del codice per mostrare anche come analizzarlo e aprire il socket? Non riesco a trovare il codice di connessione socket lato client corretto. – Radu