XMPP несколько сеансов одной и той же проблемы пользователя
Я реализовал расширение Chrome, которое позволяет использовать чат XMPP через BOSH-соединение с пенджаб-сервером, работающим на удаленном сервере. Это реализовано с использованием библиотеки Strophe javascript. Проблема, с которой я сталкиваюсь, заключается в том, что когда у меня несколько сеансов одного и того же пользователя (например, два разных браузера на одном компьютере), я не могу получить и записать во второе окно чата сообщение, отправленное из первого окна чата. Должен быть какой-то механизм, который позволяет это. Могу ли я каким-то образом получать сообщения, которые я отправил другому пользователю? Эта проблема также может быть воспроизведена на 2 или более разных машинах, так что это тоже нужно решить.
Спасибо.
3 ответа
Вы должны понимать, как работают JID, каковы приоритеты и как отправлять сообщения.
JID имеет форму: user@domain/resource
JID зарегистрированных пользователей должны быть уникальными. Обычно, когда вы используете веб-клиент, вы назначаете случайный ресурс каждому сеансу, чтобы не было конфликтов.
Теперь, когда пользователь отправляет сообщение to
атрибут <message>
В разделе stanza указывается получатель сообщения. Если ресурс является частью получателя, то только этот JID получит сообщение. Если получатель является чистым JID (user@domain), то в игру вступают приоритеты (см. Здесь):
- Ресурс с самым высоким приоритетом в любой момент времени будет тем, который получает входящие сообщения.
- Если два или более ресурса имеют одинаковый приоритет, все ресурсы с указанным приоритетом могут принимать входящие сообщения или в зависимости от реализации сервера, которую можно получать, в зависимости от критериев, специфичных для сервера.
- Если все подключенные ресурсы имеют отрицательный приоритет, входящие сообщения будут помещены в очередь на стороне сервера, пока один из ресурсов не сбросит приоритет на положительный.
Вы можете установить приоритет (целое число в [-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, вам необходимо активировать его.