Как начать разговор с клиентом Bonjour, зная его имя @host:port?


Я работаю над проектом мессенджера P2P, вроде ichat, но только для локальной сети.
Я использую библиотеку jmdns для обнаружения сервисов, тестирую с помощью pidgin и захожу как пользователь Bonjour. пока что, сервис _presence._tcp.local. хорошо обнаружен,
тогда мы знаем информацию пользователя в локальной сети, такую ​​как name@host:port, так как начать разговор с клиентом Bonjour?
Я посмотрел в XMPP, но он не поддерживает P2P, но я с трудом могу найти библиотеку для расширения Jingle, которая поддерживает P2P.
может мне стоит использовать SIP для разговора? но формат пакета совместим с Bonjour? или я должен изучить структуру обмена пакетов?
Может кто-нибудь объяснить немного о том, как ichat работает для локальной сети?
Большое спасибо за вашу помощь!

3 ответа

Решение

Я думаю, что вы немного смущены.

Добрый день - это механизм поиска услуги. Это не для общения с сервисом. Как только вы нашли имя @ host: port information, вы покончили с Bonjour.

Следующий шаг потребует от вас использования протокола, понятного службе. Знак _presence в строке службы указывает, что это служба XMPP. Вам нужно будет поговорить с ним по XMPP. Вы не можете говорить SIP с ним. Вы пытались открыть XMPP-соединение с найденным хостом и портом?

Вы говорите о SIP и Jingle. Они используются для настройки аудио или видео звонка. Если вы пишете программу обмена мгновенными сообщениями, вам не нужно это делать. Одного XMPP достаточно.

Если вы хотите поддерживать аудио или видео, вам понадобится один из этих протоколов. Поскольку служба, которую вы нашли, является службой XMPP, вам нужно будет использовать Jingle. Если у вас нет библиотеки, которая говорит на джингле, вам придется написать код самостоятельно. В информации Bonjour нет ничего, что идентифицирует SIP-сервис, поэтому вы не можете использовать SIP - если вы не можете сделать другой запрос Bonjour и найти SIP-сервис.

Я предполагаю, что вы работаете в Java. Кажется, самой популярной библиотекой XMPP для Java является Smack.

Спасибо всем за внимание, теперь я что-то нашел. XMPP не поддерживает режим P2P, поддерживает только клиенты-сервер-клиенты. но есть и другой стандарт "XEP-0174: передача сообщений без сервера", который подходит для p2p-чата в локальной сети. DNS-SD + XEP-0174, ichat работает таким образом.
поскольку я использовал библиотеку smack, она не поддерживает p2P; но кто-то сделал некоторые изменения, вот ссылка http://issues.igniterealtime.org/browse/SMACK-262.
Я не пробовал эту XMPPLLConnection, я изучил исходный код smack, он основан на сокетном соединении. К сожалению, для XEP-1074 нет библиотеки Java, поэтому мне приходится работать над потоком xml через сокет.

Вы можете использовать SIP для этого. MDNS будет вашим механизмом обнаружения, тогда вы будете использовать простой SIP для вызова, тот, который вы узнали URI, который вы хотите набрать.

SIPSIMPLE SDK (http://sipsimpleclient.com) реализует эту функцию, подписав черновик с истекшим сроком действия: http://tools.ietf.org/html/draft-lee-sip-dns-sd-uri-03 это может быть полезно Начните.

По сути, ваш клиент сгенерирует URI, такой как sip:random_stuff@ip:port, а затем опубликует его вместе с отображаемым именем с помощью MDNS. Приложение также просматривает MDNS для одноранговых узлов в локальной сети: например, _sipuri._udp. Получив URI, вы можете просто набрать номер, используя SIP.

Другие вопросы по тегам