XMPP несколько сеансов одной и той же проблемы пользователя

Я реализовал расширение Chrome, которое позволяет использовать чат XMPP через BOSH-соединение с пенджаб-сервером, работающим на удаленном сервере. Это реализовано с использованием библиотеки Strophe javascript. Проблема, с которой я сталкиваюсь, заключается в том, что когда у меня несколько сеансов одного и того же пользователя (например, два разных браузера на одном компьютере), я не могу получить и записать во второе окно чата сообщение, отправленное из первого окна чата. Должен быть какой-то механизм, который позволяет это. Могу ли я каким-то образом получать сообщения, которые я отправил другому пользователю? Эта проблема также может быть воспроизведена на 2 или более разных машинах, так что это тоже нужно решить.

Спасибо.

3 ответа

Вы должны понимать, как работают JID, каковы приоритеты и как отправлять сообщения.

JID имеет форму: user@domain/resource

JID зарегистрированных пользователей должны быть уникальными. Обычно, когда вы используете веб-клиент, вы назначаете случайный ресурс каждому сеансу, чтобы не было конфликтов.

Теперь, когда пользователь отправляет сообщение to атрибут <message> В разделе stanza указывается получатель сообщения. Если ресурс является частью получателя, то только этот JID получит сообщение. Если получатель является чистым JID (user@domain), то в игру вступают приоритеты (см. Здесь):

  1. Ресурс с самым высоким приоритетом в любой момент времени будет тем, который получает входящие сообщения.
  2. Если два или более ресурса имеют одинаковый приоритет, все ресурсы с указанным приоритетом могут принимать входящие сообщения или в зависимости от реализации сервера, которую можно получать, в зависимости от критериев, специфичных для сервера.
  3. Если все подключенные ресурсы имеют отрицательный приоритет, входящие сообщения будут помещены в очередь на стороне сервера, пока один из ресурсов не сбросит приоритет на положительный.

Вы можете установить приоритет (целое число в [-128, 127]) при отправке своего присутствия (см. Rfc для полной спецификации), например:

<presence>
  <status>Learning XMPP</status>
  <priority>1</priority>
</presence>

Если вы хотите, чтобы весь разговор, включая сообщения, отправленные вами от ваших клиентов, отображался в другом сеансе, то Carbons - это функция, которую вы ищете. Я реализовал это в плагине для Prosody.

Требуемая клиентская часть не должна быть слишком трудной для написания, вот что сделано в библиотеке Verse.

Короче говоря!

Использование:

mXmppConnection.login (USERNAME, PASSWORD, StationName/NickName);

И не:

mXmppConnection.login (USERNAME, PASSWORD);

Последний параметр называется ресурсом и представляет вашу станцию, с которой вы входите.

Таким образом, вы можете войти с тем же именем пользователя, но все же с 2 устройств.

Если вы включите углеродные сообщения: XEP-0280: углеродные сообщения при обнаружении множественного входа, сервер XMPP будет отправлять углеродное сообщение другим вашим сеансам, которые вошли в систему на разных устройствах.

<enable xmlns='urn:xmpp:carbons:2'/>

Не забудьте включить его для всех сеансов. Итак, оба сеанса получат отправку и получение сообщений. В случае получения сообщения, если у вас включен карбон, присутствие не повлияет.

Опять же, если вы хотите, чтобы сообщение не было копией, добавьте <private/>, <no-copy/> внутри строфы

<private xmlns='urn:xmpp:carbons:2'/>
<no-copy xmlns='urn:xmpp:hints'/>

Если модуль углерода не активирован на вашем сервере XMPP, вам необходимо активировать его.

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