【问题标题】:NsdManager doesn't resolve multiple discovered servicesNsdManager 不解析多个发现的服务
【发布时间】:2014-08-31 04:00:52
【问题描述】:

http://developer.android.com/training/connect-devices-wirelessly/nsd.html 示例代码开始,我一直在构建一个应用程序,旨在在同一子网中的多个设备上运行。每个设备注册相同的服务并尝试使用该服务发现子网中的其他设备。如文档中所述,每次设备注册服务时,名称都会被附加的“(N)”破坏,其中 N 是整数。每个设备,当它进行发现时

public void discoverServices() {
  mNsdManager.discoverServices(
      SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}

查找所有已注册的服务。我在保留发现的NsdServiceInfo 记录的哈希图中跟踪它们。

当我尝试解决它们时,问题就来了。如果我迭代哈希图并解析每个NsdServiceInfo,那么只有第一个是成功的。我认为问题可能是需要一个单独的NsdManager.ResolveListener,所以我为每个NsdServiceInfo 记录创建一个,但没有乐趣。

如果我阻止解析哈希图中的第一个服务,则下一个可以工作。这是 DDMS 输出:

07-09 17:11:36.799: D/P2PServiceManager(1958): Resolving services with type : PeerDiscovery
07-09 17:11:36.799: W/P2PServiceManager(1958): Resolving PeerDiscovery services with name : PeerDiscovery (3)
07-09 17:11:36.799: W/P2PServiceManager(1958): Resolving PeerDiscovery services with name : PeerDiscovery (2)
07-09 17:11:36.807: E/P2PServiceManager(1958): RRRRRRRRRRRRRRRRRRR Resolve failed : error code 3
07-09 17:11:36.830: E/P2PServiceManager(1958): RRRRRRRRRRRRRRRRRRR  Resolve Succeeded. name: PeerDiscovery\032(3)type: ._http._udphost: /192.168.1.145port: 53221txtRecord: null

我怀疑存在一些不可重入代码或其他类似问题,但我想知道是否有其他人看到过这个问题。 Google 和 StackOverflow 似乎没有答案。

[2014-07-24] 最后我坚持迭代发现的服务来解决它们,但在解决下一个服务之前等待每个结果。我想这是做事的正确方法,但是从 NsdManager 文档中并不清楚一种或另一种方式。

【问题讨论】:

  • 这个运气好吗?好像有同样的问题

标签: java android networking service resolve


【解决方案1】:

最后我在我的应用程序中修复了相同的问题,以发现我网络中相同服务名称上的多个 Bonjour 设备

我做了什么:

Activity > 启动 Discovery Listener > 启动 ResolveListener

它们都在同一个活动中声明,并通过将我发现的对象添加到设备对象列表activity.addDevice(ip, port, name, service); 来推回一个对象@

现在我只是让每个设备自己运行,而不是覆盖侦听器中的结果并只获得一个或没有结果。

希望它对遇到相同问题的人有所帮助。我会尽快准备一个代码示例。

【讨论】:

    【解决方案2】:

    对于我想同时发现的 2 个服务,我遇到了类似的问题。对我来说,解决方案就是等待第一个解决或失败,然后才开始发现下一个。这样就不会同时开始两者的发现。可以为此使用例如 CountDownLatch。

    CountDownLatch latch = new CountDownLatch(1);
    nsdManager.discoverServices(serviceType1,  NsdManager.PROTOCOL_DNS_SD, discoveryListener);
    latch.await();
    nsdManager.discoverServices(serviceType2,  NsdManager.PROTOCOL_DNS_SD, discoveryListener);
    

    ....

    ResolveListener {
        public void onServiceResolved(NsdServiceInfo serviceInfo) {
             // do your stuff
             latch.countDown();
        }
    }
    

    不要忘记在所有失败情况下对闩锁进行倒计时!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多