NsdManager 不会解析多个发现的服务



从示例开始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记录。

当我试图解决它们时,问题就来了。如果我迭代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: PeerDiscovery32(3)type: ._http._udphost: /192.168.1.145port: 53221txtRecord: null

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

〔2014-07-24〕最后,我坚持对发现的服务进行迭代以解决它们,但要等待每个结果才能解决下一个服务。我想这是正确的做事方式,但从NsdManager文档中还不清楚是哪种方式。

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

我做了什么:

活动>启动发现侦听器>启动ResolveListener

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

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

希望这对有同样问题的人有帮助。我会尽快准备一个代码样本。

对于我想同时发现的两个服务,我遇到了类似的问题。对我来说,解决方案就是等待第一个问题解决或失败,然后才开始发现下一个问题。因此,这一发现并不是同时开始的。例如,可以使用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();
    }
}

在所有故障情况下,不要忘记倒计时闩锁

最新更新