[英]What is the best way to communicate with 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
(最后一个参数)。 不幸的是,我需要使用不同的类来提供用于browse
和resolve
的回调对象。 这样做的原因是browse
和resolve
可以调用回调对象的operationFailed
方法,并且,如果我使用同一类中的回调对象,我将不知道哪个方法正在调用operationFailed
( browse
或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
会返回这种类型的对象。
并不是一个真正的答案,但要指出的是,除了Bonjour库之外,您可能还想尝试JmDNS,它是一个纯Java的开源模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.