Веб-чат XMPP: как разрешить несколько вкладок / окон? - PullRequest
10 голосов
/ 27 октября 2010

У нас есть сайт, и мы разработали для него систему чата, используя библиотеку strophe.js и XMPP-сервер ejabberd. Мы используем вложение сеанса, которое было инициировано с помощью PHP (с использованием внутренней библиотеки). Мы получаем RID и SID из скрипта PHP, а затем используем прикрепление сессии strophe. Указанные RID и SID хранятся в cookie, а значение RID в cookie обновляется при каждом обновлении RID в strophe.js. (Это позволяет повторно использовать идентификатор сеанса при обновлении страницы / переходе в другие места на сайте)

Теперь мы планируем, чтобы он работал на нескольких вкладках / окнах. Я наблюдал за реализацией Facebook, и для каждой вкладки есть длинный опросный запрос к определенному домену. Этот домен отличается для каждой вкладки. Например, первая вкладка будет 0.86.channel.facebook.com. Вторая вкладка будет 1.86.channel.facebook.com. Как я понимаю, это должно решить ограничение браузера 2 активных запросов к определенному домену. Как реализовано это решение для нескольких доменов?

Далее будет сама сессия чата. Сессии чата будут отличаться для каждой вкладки не так ли? Как пользовательский интерфейс будет синхронизирован с каждой вкладкой, как Facebook? Моя идея заключается в том, что для каждого действия будет отправляться сообщение на собственный JID пользователя, содержащее действие, выполненное в отношении чата. Например, если открыть окно чата, вы отправите сообщение, например:

<message from="my_own_jid" to="my_own_jid" type="chat">
    <body>{"jid-of-contact":"open-chat-box"}</body>
</message>

и это будет зафиксировано в клиенте чата, и пользовательский интерфейс будет соответствующим образом изменен (в этом случае откроется окно чата для контакта).

Какие-либо предложения / комментарии по этой реализации?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 17 ноября 2010

Я и моя команда работали над точно такой же проблемой - только то, что мы используем Openfire вместо Ejabberd (в основном потому, что у нас есть навыки Java, но мы не знакомы с Erlang). Наша компания занимается созданием браузерных игр.

Наше решение состоит из:

  • XMPPHP - для предварительной привязки
  • Strophe.js - для присоединения сеанса ( изменено )
  • Пенджаб - в качестве диспетчера соединений ( расширено, изменено )
  • Openfire - в качестве XMPP-сервера

Мы используем Пенджаб, потому что реализация Openfire в BOSH поначалу не очень хорошо работала с другими компонентами.

По сути, мы решили не создавать сеанс для каждой вкладки. Это связано с тем, что некоторые из наших игр работают так же, как и обычные веб-сайты: щелчок по ссылке запросит полную новую страницу (в то время как новые игры полностью работают в ajax, и большая часть GUI остается прежней). Другими словами, наш веб-чат должен работать в среде, где пользователь «перемещается по сайту». Один сеанс для одной вкладки будет означать новый сеанс для каждого запроса страницы, что кажется огромными накладными расходами, потому что игроки часто нажимают довольно быстро. Итак, мы хотели создать одну сессию и привязаться к игроку.

Чтобы решить, что мы, как и вы, изменили strophe.js для чтения / сохранения RID в файле cookie, чтобы все вкладки знали текущий RID и увеличивали его до правильного значения. Другое дело, что мы заставили Strophe добавить CID в тело разделов XMPP. CID, как идентификатор клиента. Я объясню использование в ближайшее время ..

Затем планировалось изменить две вещи в пенджабе. Сначала мы добавили класс, который заменил обычный способ хранения ожидающих запросов в пенджабе. Ожидание BOSH-запросов теперь сохраняется в словаре с CID (который strophe.js теперь добавляет к телу каждого запроса) в качестве ключа. Когда приходит другой запрос из той же вкладки, Пенджаб знает, какой ожидающий запрос отправить пустой ответ. Если появятся новые строфы, Пенджаб отправит их всем ожидающим запросам в словаре. Таким образом, входящее сообщение распространяется на все вкладки. Во-вторых, мы добавили несколько строк, чтобы сообщение, отправленное с одной вкладки, сразу же возвращалось на все остальные вкладки. Таким образом, сообщение может появиться и в истории других вкладок.

Конечно, есть и другие проблемы, с которыми нужно столкнуться, например, не потерять историю чата в графическом интерфейсе, когда игрок переходит к следующему экрану. Хранить это в cookie-файле было бы плохо, так как все это отправляется с каждым запросом и вызывает большой трафик. Для этого мы думаем о реализации чего-то похожего на архивирование сообщений XEP-0136.

Короче говоря, нам пришлось иметь дело с исправлением / расширением strophe.js и пенджаба, и мы немного изменили стандарты. Но пока он работает нормально, и я рад видеть, как эта установка будет работать в бета-версии.

3 голосов
/ 19 декабря 2011

Мое решение:

Каждая вкладка имеет свое собственное соединение с другим ресурсом, все с приоритетом 1.

В openfire добавьте переменную сервера route.all-resources: true
Сообщения будут передаваться всемресурсы.

...