Как лучше всего общаться с Bonjour? - PullRequest
2 голосов
/ 18 марта 2010

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.

1 Ответ

0 голосов
/ 23 июня 2010

Не совсем ответ, но хотелось бы отметить, что помимо библиотеки Bonjour вы можете попробовать JmDNS, который является чистым Java, с открытым исходным кодом модуля.

...