11

JmDNSを使用しているクライアント/サーバアプリケーションでサービス検出を有効にしようとしています。クライアント/サーバでのJmDNSサービスの検出

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

しかし、私は私のクライアントが登録されているサービスや使用からポート番号とIPアドレスを取得する必要がありする方法を考え出すのトラブルを抱えている:私は完全にこれは似ているコードで、サーバー側のサービスレジストリを理解しますこのデータはTCP接続を開きます。私はJmDNSの使い方の例を探しましたが、役に立たないものです。誰かがここに私にいくつかの基本的な例を与えることができますまたは、誰かがJmDNS上の良いリソース/チュートリアルへのリンクを持っていれば、それらを提供してもらえますか?

注:ここではJmDNSが必要であるため、JmDNSのみに関する回答に感謝し、代替案を提示しません。また、私はJmDNS APIを幅広く見てきましたが、まだ理解できませんので、ドキュメントへのリンクをリソースとして投稿しないでください。

ありがとうございました。

答えて

20

サーバー側:

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

クライアント側:

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

あなたはURL http://192.168.11.2:6666/myTestServiceを持っていたら、あなたはそれのオープンソケット接続を使用/解析することができます。助けて欲しい。

+0

ありがとう、これは本当に物事が私にとってははるかに明確になります。 Java(または他の言語でも)のコールバックに全く慣れていないので、ServiceInfo []とは対照的に、コールバックからサービス情報を取得する方法を教えてください。 serviceListenerの実装の外側でserviceUrl文字列を宣言するだけで、グローバルにアクセスできますか? –

+0

はい、通常、内部クラスとしてServiceListenerを定義し、外部クラスのインスタンス変数としてserviceUrlを定義します。 – yorkw

+0

@yorkwコードサンプルを展開して、解析してソケットを開く方法を示すことができますか?私は適切なクライアント側ソケット接続コードを見つけることができません。 – Radu

関連する問題