XMPP несколько сеансов одной и той же проблемы пользователя
Я реализовал расширение chrome, которое позволяет использовать XMPP-чат через соединение BOSH с сервером punjab, запущенным на удаленном сервере. Он реализован с использованием библиотеки javascript Strophe. Проблема, с которой я сталкиваюсь, - это когда у меня несколько сеансов одного и того же пользователя (например, два разных браузера на одном компьютере). Я не могу получить и войти во второе окно чата, которое я отправил из первого окна чата. Должен быть какой-то механизм, который позволяет это. Могу ли я каким-то образом получать сообщения, которые я отправил другому пользователю? Проблема также может быть воспроизведена на двух или более разных машинах, поэтому это также необходимо решить.
Спасибо.
Ответы
Ответ 1
Вам нужно понять, как работают JID, какие приоритеты и как отправлять сообщения.
JID имеет вид: [email protected]/resource
JID зарегистрированных пользователей должны быть уникальными. Обычно, когда вы используете веб-клиент, вы назначаете случайный ресурс для каждого сеанса, чтобы не иметь столкновений.
Теперь, когда пользователь отправляет сообщение, атрибут to
строфы <message>
указывает получателя сообщения. Если ресурс является частью получателя, то только этот JID получит сообщение. Если получатель является голым JID (user @domain), тогда приоритеты приходят в игру (см. здесь):
- Ресурс с наивысшим приоритетом в любой момент времени будет тем, который принимает входящие сообщения.
- Если два или более ресурсов имеют одинаковый приоритет, все ресурсы с указанным приоритетом могут принимать входящие сообщения или в зависимости от реализации сервера, которые могут быть получены в зависимости от критериев, специфичных для сервера.
- Если все связанные ресурсы имеют отрицательный приоритет, входящие сообщения будут поставлены на серверную сторону, пока один из ресурсов не сбрасывает приоритет, чтобы быть положительным.
Вы можете установить приоритет (целое число в [-128, 127]) при отправке своего присутствия (см. rfc для полная спецификация), например:
<presence>
<status>Learning XMPP</status>
<priority>1</priority>
</presence>
Ответ 2
Если вы хотите, чтобы весь разговор, включая сообщения, отправляемые от вашего клиента (-ов), чтобы отображаться на другом сеансе, Carbons - это функция, ищу. Я реализовал это в плагине для Prosody.
Необходимая клиентская часть не должна быть слишком сложной для записи, здесь это делается в библиотеке Verse.
Ответ 3
Сделайте короткую историю!
Использование:
mXmppConnection.login (USERNAME, PASSWORD, StationName/NickName);
И не:
mXmppConnection.login (USERNAME, PASSWORD);
Последний параметр, называемый ресурсом, и представляет вашу станцию, с которой вы входите.
Таким образом, вы можете войти в систему с тем же именем пользователя, но все же с двух устройств.
Ответ 4
Если вы включите Углероды: 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-сервере не активирован модуль Carbons, его необходимо активировать.