2012-02-14 10 views
6

He podido obtener las muestras que vienen con JmDNS para compilar y ejecutar, sin embargo, no puedo obtener ninguna de las clases para descubrir mis servicios.Muestras con JmDNS

estoy corriendo un entorno Windows con el funcionamiento de varios ordenadores de VNC, SSH & Apache y he estado tratando de conseguir JmDNS para descubrir al menos uno de estos ...

Lo que quiero es lo ideal para estar capaz de detectar todos los servidores VNC en ejecución en mi red. ¿Hay algún tipo de emparejamiento entre el cliente y el servidor donde solo puedo descubrir un servicio si lo he registrado usando JmDNS?

Cualquier ayuda para obtener algunos resultados de las muestras será apreciada, la documentación no es de mucha ayuda.

import java.io.IOException; 
import java.util.logging.ConsoleHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.jmdns.JmDNS; 
import javax.jmdns.ServiceEvent; 
import javax.jmdns.ServiceListener; 

/** 
* Sample Code for Service Discovery using JmDNS and a ServiceListener. 
* <p> 
* Run the main method of this class. It listens for HTTP services and lists all changes on System.out. 
* 
* @author Werner Randelshofer 
*/ 
public class DiscoverServices { 

    static class SampleListener implements ServiceListener { 
     @Override 
     public void serviceAdded(ServiceEvent event) { 
      System.out.println("Service added : " + event.getName() + "." + event.getType()); 
     } 

     @Override 
     public void serviceRemoved(ServiceEvent event) { 
      System.out.println("Service removed : " + event.getName() + "." + event.getType()); 
     } 

     @Override 
     public void serviceResolved(ServiceEvent event) { 
      System.out.println("Service resolved: " + event.getInfo()); 
     } 
    } 

    /** 
    * @param args 
    *   the command line arguments 
    */ 
    public static void main(String[] args) { 
     try { 

      // Activate these lines to see log messages of JmDNS 
      boolean log = false; 
      if (log) { 
       Logger logger = Logger.getLogger(JmDNS.class.getName()); 
       ConsoleHandler handler = new ConsoleHandler(); 
       logger.addHandler(handler); 
       logger.setLevel(Level.FINER); 
       handler.setLevel(Level.FINER); 
      } 

      final JmDNS jmdns = JmDNS.create(); 
      String type = "_http._tcp.local."; 
      if(args.length > 0) { 
       type = args[0]; 
      } 
      jmdns.addServiceListener(type, new SampleListener()); 

      System.out.println("Press q and Enter, to quit"); 
      int b; 
      while ((b = System.in.read()) != -1 && (char) b != 'q') { 
       /* Stub */ 
      } 
      jmdns.close(); 
      System.out.println("Done"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

JmDNS solo no funciona en general, realmente debería hacerlo en todas las tarjetas de red usando un NetworkTopologyListener. JmmDNS debería hacerlo por usted, pero no funcionó para mí. –

+0

@ErikMartino: ¿puede dar un ejemplo de NetworkTopologyListener que funcionó? –

Respuesta

5

para descubrir un tipo específico de servicio, lo que necesita saber el nombre del tipo de servicio correcto, echa un vistazo a DNS SRV (RFC 2782) Service Types:

String bonjourServiceType = "_http._tcp.local."; 
bonjourService = JmDNS.create(); 
bonjourService.addServiceListener(bonjourServiceType, bonjourServiceListener); 
ServiceInfo[] serviceInfos = bonjourService.list(bonjourServiceType); 
for (ServiceInfo info : serviceInfos) { 
    System.out.println("## resolve service " + info.getName() + " : " + info.getURL()); 
} 
bonjourService.close(); 

para VNC, utilice _rfb._tcp.local.
Para SSH, use _ssh._tcp.local.
Para Apache, use _http._tcp.local.

+0

Gracias pero mi código parece correcto, puedo acceder al mac I setup, pero aún no puedo hacer que el servidor aparezca en la lista incluso con el código que me proporcionó (que es similar a mi propio código). He editado la publicación anterior para agregar mi código de prueba. ¿Puedes probar esto en tu red y verificar si funciona? Tal vez algo está mal en mi configuración en alguna parte. – Ali

+1

Si se trata de una máquina mac, puede bonjour el servicio VNC (Apple Remote Desktop) utilizando el tipo de servicio = "_net-assistant._udp". – yorkw

+0

He tenido la suerte de obtener el código para detectar servicios en mi máquina local, pero no servicios en la red local. Cuando ejecuto el jmdns jar, aparece un diálogo que no tiene problemas para detectar la máquina en mi red. Por lo tanto, actualmente el plan es recorrer el origen de ese diálogo y con suerte descubrir qué está pasando. – Ali

Cuestiones relacionadas