【问题标题】:JmDNS service discovery in client-server客户端-服务器中的 JmDNS 服务发现
【发布时间】:2011-12-31 17:36:41
【问题描述】:

我正在尝试使用 JmDNS 在我的客户端-服务器应用程序中启用服务发现。我完全理解服务器端的服务注册表,代码如下:

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

但是,我无法弄清楚如何让我的客户端从注册的服务中检索端口号和 IP 地址,并使用这些数据打开 TCP 连接。我搜索了如何使用 JmDNS 的示例,但无济于事。这里有人可以给我一些基本的例子吗?或者,如果有人有任何 JmDNS 上好的资源/教程的链接,他们可以提供吗?

注意:JmDNS 在这里是必需品,因此我希望得到仅与 JmDNS 相关且不提供替代方案的答案。另外,我已经广泛研究了 JmDNS API,但仍然无法弄清楚,所以请不要将文档链接作为资源发布。

谢谢。

【问题讨论】:

    标签: java network-programming client-server service-discovery jmdns


    【解决方案1】:

    服务器端:

    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 字符串以便我可以全局访问它?
    • 可以,通常将ServiceListener定义为内部类,将serviceUrl定义为外部类的实例变量。
    • @yorkw 您是否有机会扩展代码示例以显示如何解析它并打开套接字?我找不到正确的客户端套接字连接代码。
    • 这里的Contstants.mdnsServiceType 是什么?它与“我的服务类型”相同吗? jmdns中的这些方法没有cmets,参数名称完全没用..
    • @Erix,请参阅this answer 中的示例代码。
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多