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
.