【问题标题】:What is the best way to communicate with Bonjour?与 Bonjour 沟通的最佳方式是什么?
【发布时间】:2010-03-18 12:06:41
【问题描述】:

Bonjour 提供了一个不错的方法:DNSSD.browse("_killerapp._tcp", this);。作为该方法的第一个参数,我给出了可能在网络中可用的服务类型,作为第二个参数,我给出了一个“回调对象”。所考虑的方法“浏览”指定类型的服务(第一个参数)。

在浏览过程中,它可以“找到”然后“丢失”一项服务。如果服务被发现(丢失),则调用回调对象的 serviceFound (serviceLost) 方法。使用找到的服务的一些参数调用 serviceFound。更详细的:

serviceFound(DNSSDService browser, int flags, int ifIndex, String serviceName, String regType, String domain)

但是要获得服务的 IP 地址和端口,我们需要做额外的操作(人们称之为“解析服务”)。这是逻辑对我来说有点奇怪。为什么 serviceFound 不能提供这些信息?我的意思是为什么 Bonjour 无法在找到服务时自动解析服务。

无论如何,我只是接受给定的逻辑并尝试使用它。从serviceFound 我打电话给DNSSD.resolve(0, ifIndex, serviceName, regType, domain, this)

和之前一样,我给resolve(最后一个参数)一个回调对象。不幸的是,我需要使用不同的类来为browseresolve 提供回调对象。原因是browseresolve 可以调用回调对象的operationFailed 方法,如果我使用同一类的回调对象,我将不知道哪个方法正在调用operationFailed(@987654332 @ 或 resolve)。

因此,我创建了一个单独的类来实例化 resolve 方法的回调对象。在这个类中,我有一个名为 serviceResolved 的方法,它由 Bonjour 使用已解析服务的 IP 地址和端口调用:

serviceResolved(DNSSDService resolver, int flags, int ifIndex, String fullname, String hostname, int port, TXTRecord txtRecord)

我认为IP地址和端口应该是执行浏览的对象的字段。所以,在serviceResolved 我有IP 和端口,我想将这些值设置为browse 服务的实例的相应字段。但是我该怎么做呢?此实例不作为serviceResolved 方法的参数给出。所以,它是隐形的!

此外,我看到 serviceResolved 和 serviceFound 将DNSSDService resolver 作为第一个参数。有人知道它是什么吗?可能这个对象可以用来设置服务的参数吗?我知道browse返回了这种类型的对象。

【问题讨论】:

    标签: java networking bonjour


    【解决方案1】:

    不是一个真正的答案,但想指出, 除了 Bonjour 库,您可能还想尝试 JmDNS,它是一个纯 Java 的开源模块。

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 2011-06-04
      • 2018-05-12
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多