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

一旦你的網址http://192.168.11.2:6666/myTestService,你可以分析/使用開放套接字連接。希望有所幫助。

+0

謝謝,這真的讓事情變得更清晰。由於完全不熟悉Java中的回調(或者任何語言,就此而言),我將如何從回調中檢索服務信息,而不是ServiceInfo []?是否只需要在serviceListener實現之外聲明serviceUrl字符串,以便我可以全局訪問它? –

+0

是的,通常將ServiceListener定義爲內部類,並將serviceUrl定義爲外部類的實例變量。 – yorkw

+0

@yorkw你有可能展開代碼示例以展示如何解析它並打開套接字嗎?我無法找到正確的客戶端套接字連接代碼。 – Radu