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

4
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

我怀疑存在一些不可重入代码或其他类似的问题,但我想知道是否有人遇到过这个问题。谷歌和StackOverflow似乎没有答案。
[2014-07-24] 最终,我选择迭代已发现的服务以解决它们,但在解决下一个服务之前等待每个结果。我认为这是正确的做法,但从NsdManager文档上看不清楚应该如何操作。

1
有进展了吗?似乎遇到了同样的问题。 - Gabor Peto
2个回答

1

最终我解决了我的应用程序中的同一服务名称下发现多个Bonjour设备的问题。

我做了什么:

活动 > 启动发现监听器 > 启动解析监听器

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

现在我只获取每个设备本身,而不是在监听器中覆盖结果并只获取一个或零个结果。

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


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();
    }
}

不要忘记在所有失败情况下倒计时锁存器!


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