与卓悦沟通的最佳方式是什么?

时间:2010-03-18 12:06:42

标签: java networking bonjour

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方法,如果我使用同一个类的回调对象,我将不知道哪个方法调用了operationFailedbrowseresolve)。

因此,我创建了一个单独的类来实例化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会返回此类型的对象。

1 个答案:

答案 0 :(得分:0)

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