Подтвердить что ты не робот

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

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

Спасибо.

4b9b3361

Ответ 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, его необходимо активировать.