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
(最后一个参数)提供了一个回调对象。不幸的是,我需要使用不同的类为browse
和resolve
提供回调对象。原因是browse
和resolve
可以调用回调对象的operationFailed
方法,如果我使用同一类中的回调对象,我将不知道哪个方法正在调用operationFailed
(或browse
)。因此,我创建了一个单独的类来为
resolve
方法实例化一个回调对象。在此类中,我有一个名为resolve
的方法,该方法由Bonjour使用IP地址和已解析服务的端口进行调用:serviceResolved(DNSSDService resolver, int flags, int ifIndex, String fullname, String hostname, int port, TXTRecord txtRecord)
我认为IP地址和端口应该是执行浏览的对象的字段。因此,在
serviceResolved
中,我具有IP和端口,并且想要将这些值设置为该serviceResolved
服务实例的相应字段。但是我该怎么办呢?该实例不作为browse
方法的参数给出。所以,它是看不见的!而且,我看到serviceResolved和serviceFound作为第一个参数
serviceResolved
。有人知道这是什么吗?可以使用此对象来设置服务的参数吗?我知道DNSSDService resolver
返回此类型的对象。 最佳答案
并不是真正的答案,但我想指出一点,
除了Bonjour库之外,您可能还想尝试JmDNS,它是纯Java开源模块。