Bonjour提供了一個不錯的方法:DNSSD.browse("_killerapp._tcp", this);
。作爲這種方法的第一個參數,我給出了可能在網絡中可用的服務類型,並且作爲第二個參數給出了「回調對象」。所考慮的方法「瀏覽」指定類型的服務(第一個參數)。與Bonjour溝通的最佳方式是什麼?
在瀏覽期間,它可以「查找」,然後「丟失」一項服務。如果發現服務(丟失)bonjour調用回調對象的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
方法,該方法是由卓悅與解決服務的IP地址和端口稱爲:
serviceResolved(DNSSDService resolver, int flags, int ifIndex, String fullname, String hostname, int port, TXTRecord txtRecord)
我認爲,IP地址和端口應是執行瀏覽對象的領域。所以,在serviceResolved
我有IP和端口,我想將這些值設置爲該服務的實例的相應字段。但我該怎麼做呢?此實例不作爲serviceResolved
方法的參數給出。所以它是隱形的!
此外,我看到serviceResolved和serviceFound作爲第一個參數,DNSSDService resolver
。有人知道它是什麼嗎?可能是這個對象可以用來設置服務的參數嗎?我知道這種類型的對象是由browse
返回的。