首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NsdManager不解析多个已发现的服务

NsdManager不解析多个已发现的服务
EN

Stack Overflow用户
提问于 2014-07-09 23:36:04
回答 2查看 2.2K关注 0票数 4

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

代码语言:javascript
复制
public void discoverServices() {
  mNsdManager.discoverServices(
      SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
}

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

当我试图解决这些问题时,问题就来了。如果我迭代hashmap并解析每个NsdServiceInfo,那么只有第一个是成功的。我想问题可能是需要一个单独的NsdManager.ResolveListener,所以我为每个NsdServiceInfo记录创建一个,但不是joy。

如果我阻止hashmap中的第一个服务被解析,那么下一个服务就能工作。以下是DDMS输出:

代码语言:javascript
复制
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似乎没有答案。

最后,我坚持迭代已发现的服务来解决它们,但是在解析下一个服务之前,要等待每个结果。我认为这是正确的方法,但从NsdManager文档中还不清楚。

EN

回答 2

Stack Overflow用户

发布于 2016-04-14 12:40:38

最后,我在我的应用程序中解决了相同的问题,以便在我的网络中的同一服务名上发现多个Bonjour设备。

我所做的:

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

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

现在,我只需要将每个设备安装在自己的设备上,而不是覆盖侦听器中的结果,只获得一个或一个结果。

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

票数 0
EN

Stack Overflow用户

发布于 2018-01-02 18:15:33

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

代码语言:javascript
复制
CountDownLatch latch = new CountDownLatch(1);
nsdManager.discoverServices(serviceType1,  NsdManager.PROTOCOL_DNS_SD, discoveryListener);
latch.await();
nsdManager.discoverServices(serviceType2,  NsdManager.PROTOCOL_DNS_SD, discoveryListener);

……

代码语言:javascript
复制
ResolveListener {
    public void onServiceResolved(NsdServiceInfo serviceInfo) {
         // do your stuff
         latch.countDown();
    }
}

不要忘记在所有故障情况下都要计算锁锁!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24665342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档