2012-02-14 13 views
6

Sono riuscito a compilare ed eseguire gli esempi forniti con JmDNS, tuttavia non riesco a ottenere nessuna delle classi per scoprire i miei servizi.Esempi con JmDNS

Sono in esecuzione un ambiente Windows con più di PC con VNC, SSH & Apache e ho cercato di ottenere JmDNS alla scoperta di almeno uno di questi ...

Quello che voglio è in posizione ideale per essere in grado di rilevare tutti i server VNC in esecuzione sulla mia rete. Esiste una sorta di accoppiamento client e server in cui posso scoprire un servizio solo se l'ho registrato utilizzando JmDNS?

Qualsiasi aiuto per ottenere risultati dai campioni sarà apprezzato, la documentazione non è di grande aiuto.

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 da solo non funziona in generale, si dovrebbe davvero farlo su tutte le schede di rete utilizzando un NetworkTopologyListener. JmmDNS dovrebbe farlo per te ma non ha funzionato per me. –

+0

@ErikMartino-puoi dare un esempio di NetworkTopologyListener che ha fatto worK? –

risposta

5

alla scoperta di un tipo specifico di servizio, è necessario conoscere il nome del tipo di servizio corretto, controlla 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(); 

per VNC, utilizzare _rfb._tcp.local.
Per SSH, utilizzare _ssh._tcp.local.
Per Apache, utilizzare _http._tcp.local.

+0

Grazie, ma il mio codice sembra corretto, posso eseguire il vnc nel Mac che ho configurato, ma non riesco ancora a ottenere il server da elencare anche con il codice che hai fornito (che è simile al mio stesso codice). Ho modificato il post sopra per aggiungere il mio codice di test. Puoi provare questo sulla tua rete e verificare se funziona? Forse qualcosa non va nella mia installazione da qualche parte. – Ali

+1

Se si tratta di una macchina mac, è possibile usufruire del servizio VNC (Apple Remote Desktop) utilizzando service type = "_net-assistant._udp." – yorkw

+0

Ho avuto la fortuna di ottenere il codice per rilevare i servizi sul mio computer locale ma non i servizi sulla rete locale. Quando eseguo il jar jmdns, viene visualizzata una finestra di dialogo che non ha problemi a rilevare la macchina sulla mia rete. Quindi attualmente il piano è di passare attraverso la fonte per quel dialogo e, si spera, capire cosa sta succedendo. – Ali