NsdManager无法解析多个已发现的服务

时间:2014-07-09 23:36:04

标签: java android networking service resolve

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

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

查找已注册的所有服务。我在一个hashmap中跟踪它们,这个hashmap保留了发现的NsdServiceInfo记录。

当我尝试解决问题时,问题就来了。如果我迭代hashmap并解析每个NsdServiceInfo,那么只有第一个成功。我想也许问题是需要单独的NsdManager.ResolveListener,所以我为每个NsdServiceInfo记录创建一个,但没有快乐。

如果我阻止hashmap中的第一个服务被解析,那么下一个服务就可以了。这是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

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

[2014-07-24]最后,我坚持迭代已发现的服务来解决它们,但在解析下一个服务之前等待每个结果。我认为这是做事的正确方法,但是从NsdManager doc那里得到的方法并不清楚。

2 个答案:

答案 0 :(得分:0)

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

我做了什么:

  

活动>启动Discovery Listener>启动ResolveListener

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

来推回我找到的对象

现在我只是将每个设备放在自己身上而不是覆盖侦听器中的结果,只获得一个或没有结果。

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

答案 1 :(得分:0)

我想要同时发现的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();
    }
}

在所有失败的情况下都不要忘记倒计时!