JmDNS客户端-服务器中的服务发现

11

我正在尝试使用JmDNS在我的客户端-服务器应用程序中启用服务发现。我完全了解服务器端的服务注册,其中代码类似于:

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

然而,我遇到了一个问题,即无法弄清如何让客户端从已注册的服务中检索端口号和IP地址,并使用这些数据打开TCP连接。我已经搜索了如何使用JmDNS的示例,但是没有找到合适的。这里是否有人可以给我一些基本示例?或者如果有人有关于JmDNS的好资源/教程链接,他们能否提供一下呢?

注意:在这里 JmDNS 是必需品,因此我希望答案仅涉及 JmDNS 而不提供替代方案。此外,我已经广泛查阅了 JmDNS API,仍然无法理解,请不要将文档链接作为资源发布。

谢谢。

1个回答

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,你可以解析它并打开套接字连接。希望这对你有所帮助。


谢谢,这确实让我更加清晰了。由于我完全不熟悉Java(或任何语言)中的回调函数,那么如何从回调函数中检索服务信息而不是ServiceInfo[]呢?只需要在serviceListener实现外部声明serviceUrl字符串,以便可以全局访问吗? - Richard Stokes
通常情况下,将ServiceListener定义为内部类,并将serviceUrl定义为外部类的实例变量。 - yorkw
@yorkw 有没有可能扩展代码示例,同时展示如何解析它并打开套接字?我找不到正确的客户端套接字连接代码。 - Radu
这里的Contstants.mdnsServiceType是什么?它和"my-service-type"是一样的吗?jmdns中这些方法没有注释,参数名称完全无用。 - Erix
@Erix,请查看此答案中的示例代码。 - yorkw
我真的需要在serviceAdded()中调用mdnsService.requestServiceInfo()吗? - JohnyTex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接