XMPP несколько сеансов одной и той же проблемы пользователя - PullRequest
12 голосов
/ 27 февраля 2012

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

Спасибо.

Ответы [ 3 ]

27 голосов
/ 27 февраля 2012

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

JID имеет вид: user@domain/resource

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

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

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

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

<presence>
  <status>Learning XMPP</status>
  <priority>1</priority>
</presence>
10 голосов
/ 28 февраля 2012

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

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

4 голосов
/ 23 июля 2013

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

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

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

А не:

mXmppConnection.login (USERNAME, PASSWORD);

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

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

...