Как Google Talk реплицирует сообщения на разных устройствах?
Мне интересно, как (официальным) клиентам GTalk удается отображать все полученные сообщения, даже если они изначально были использованы другим клиентом. Например: я вошел в GTalk на gmail.com на моем ноутбуке и в то же время через официальное приложение GTalk на моем устройстве Android. Друг отправляет мне сообщение, которое отображается как на клиенте gmail.com, так и на клиенте Android. (Я думаю, что первоначально он был перенаправлен только одному из клиентов, но второй клиент получает сообщение позже)
Недавно я обнаружил, что есть очень похожая функция XMPP, которая называется Carbons. Однако после запроса на быстрое обнаружение сервисов серверы Google не рекламировали эту функцию. XEP-0313 и XEP-0136 тоже хорошо выглядят, но серверы их тоже не афишируют.
Возможно связанный вопрос: доставьте сообщение Google Talk всем зарегистрированным клиентам, используя XMPPPY
2 ответа
Когда вы начинаете новый чат, вы должны отправить первое сообщение пользователям голого Jid. Это то, что делает большинство клиентов. Когда сервер GTalk получает сообщение чата с пустым Jid, он направляет сообщение на все доступные ресурсы. Для всех последующих сообщений в этом диалоге клиенты обычно выбирают Ресурс и отправляют их в полные Jids. Сообщения не должны тиражироваться.
Многие другие серверы направляют сообщение не голым Jids всем ресурсам, а наиболее доступному ресурсу - клиенту с наивысшим приоритетом.
Вот цитата из RFC:
If there is more than one resource with a non-negative presence priority then the
server MUST either
(a) deliver the message to the "most available" resource or
resources (according to the server's implementation-specific algorithm, e.g., treating
the resource or resources with the highest presence priority as "most available") or
(b) deliver the message to all of the non-negative resources.
XEP-0280 определяет это. Как я понимаю, он определяет механизм уведомления всех ресурсов от одного и того же пользователя, когда один из них отправляет сообщение кому-либо. Я имею в виду, что Алиса / КПК отправляет сообщение Бобу, поэтому Алиса / мобильный телефон и Алиса / ПК получат копию сообщения, отправленного Алисой / КПК.
Надеюсь, поможет. В настоящее время я ищу сервер, который реализует это, а также для клиентской библиотеки. Если нет, я сам реализую это в библиотеке jabberd2 и gloox xmpp.
Ура,