2012-02-14 20 views
6

JmDNSに付属のサンプルをコンパイルして実行することができましたが、私のサービスを発見するクラスはありません。JmDNSを使用したサンプル

私は理想的に欲しい...

を私は複数のPCの実行中のVNC、SSH & ApacheでのWindows環境を実行していると私は、これらの少なくとも一つを発見するJmDNSを取得しようとしてきたことですネットワーク上のすべての実行中のVNCサーバーを検出することができます。 JmDNSを使用して登録した場合にのみサービスを検出できるクライアントとサーバーのペア設定がありますか?

サンプルからいくつかの結果が得られるのを助けてくれれば幸いです。ドキュメントはあまり役に立ちません。

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だけでは一般的に動作しません。NetworkTopologyListenerを使用して、すべてのネットワークカードで実際に行う必要があります。 JmmDNSはあなたのためにそれを行う必要がありますが、私のために働いていない。 –

+0

@ErikMartino - worKを行ったNetworkTopologyListenerの例を挙げることができますか? –

答えて

5

サービスの特定のタイプを発見するために、あなたは、正しいサービスタイプの名前を知っている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(); 

VNCの場合は、_rfb._tcp.localを使用しています。
SSHの場合は、_ssh._tcp.localを使用します。
Apacheの場合は、_http._tcp.localを使用してください。

+0

ありがとうございますが、私のコードは正しいと思われますが、私はMacのセットアップにvncできますが、あなたが提供したコード(これは私自身のコードに似ています)であってもサーバをリストに表示できません。上記の投稿を編集してテストコードを追加しました。あなたのネットワーク上でこれを試して、動作するかどうか確認できますか?おそらく何か私のセットアップのどこかで間違っています。 – Ali

+1

Macマシンの場合は、service type = "_net-assistant._udp"を使用してVNCサービス(Apple Remote Desktop)を保守できます。 – yorkw

+0

私はローカルマシン上のサービスではなく、ローカルネットワーク上のサービスを検出するためのコードを取得することができました。 jmdns jarを実行すると、ネットワーク上のマシンを検出するのに問題がないダイアログが表示されます。だから、現在計画はそのダイアログのソースを突き抜けて、うまくいけば何が起こっているのか把握することです。 – Ali

関連する問題