从示例开始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: PeerDiscovery 32(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();
}
}
在所有故障情况下,不要忘记倒计时闩锁