11

Estoy intentando habilitar el descubrimiento del servicio en mi aplicación cliente-servidor utilizando JmDNS. Entiendo perfectamente registro de servicios en el lado del servidor, con el código que se parece a esto:Descubrimiento del servicio JmDNS en el cliente-servidor

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

Sin embargo, estoy teniendo problemas para averiguar cómo hacer que mi cliente recuperar el número de puerto y la dirección IP del servicio registrada y su uso esta información para abrir una conexión TCP. He buscado ejemplos de cómo usar JmDNS pero fue en vano. ¿Puede alguien aquí darme algunos ejemplos básicos? O si alguien tiene enlaces a buenos recursos/tutoriales en JmDNS, ¿podrían ellos proporcionarlos?

Nota: JmDNS es una necesidad aquí, por lo que agradecería las respuestas relativas solo a JmDNS y no ofrecer una alternativa. Además, he examinado extensamente la API de JmDNS y aún no puedo encontrarla, así que no publique un enlace a los documentos como recurso.

Gracias.

Respuesta

20

lado del servidor:

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

lado del cliente:

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 vez que tenga la URL http://192.168.11.2:6666/myTestService, puede analizar/utilizarlo conexión de socket abierto. Espero que ayudes.

+0

Gracias, esto realmente hace las cosas mucho más claras para mí. Como no estoy completamente familiarizado con las devoluciones de llamada en Java (o en cualquier idioma, para el caso), ¿cómo puedo obtener la información de servicio de la devolución de llamada en lugar de ServiceInfo []? ¿Es solo cuestión de declarar la cadena serviceUrl fuera de la implementación serviceListener para que pueda acceder a ella globalmente? –

+0

Sí, normalmente define ServiceListener como clase interna y define serviceUrl como una variable de instancia de clase externa. – yorkw

+0

@yorkw ¿Alguna posibilidad de que pueda expandir el ejemplo del código para mostrar también cómo analizarlo y abrir el socket? No puedo encontrar el código de conexión de socket adecuado del lado del cliente. – Radu

Cuestiones relacionadas