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