Google Talk 如何跨设备复制消息?

Posted

技术标签:

【中文标题】Google Talk 如何跨设备复制消息?【英文标题】:How does Google Talk replicate messages across devices? 【发布时间】:2013-02-11 21:19:23 【问题描述】:

我想知道(官方)GTalk 客户端如何设法显示收到的所有消息 - 即使它最初是由另一个客户端使用的。例如:我在笔记本电脑上登录 gmail.com 上的 GTalk,同时通过我的 android 设备上的官方 GTalk 应用程序登录。一位朋友向我发送了一条消息,该消息显示在 gmail.com 客户端和 Android 客户端上。 (我认为它最初只转发给任一客户端,但第二个客户端稍后会获取消息)

我最近发现有一个非常相似的 XMPP 功能,称为Carbons。然而,在一个快速的服务发现请求之后,谷歌的服务器并没有宣传这个功能。 XEP-0313 和 XEP-0136 看起来也不错,但服务器也不宣传它们。

可能相关的问题:Deliver Google Talk message to all logged in clients using XMPPPY

【问题讨论】:

【参考方案1】:

当您发起新的聊天时,您应该将第一条消息发送给用户裸 Jid。这是大多数客户正在做的事情。当 GTalk 服务器将聊天消息检索到裸 Jid 时,它会将消息路由到所有可用资源。对于此对话中的所有后续消息,客户端通常会选择资源并将它们发送给完整的 Jids。那时不应复制这些消息。

许多其他服务器不会将消息路由到裸 Jid 到所有资源,而是路由到最可用的资源,即具有最高优先级的客户端。

这是 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. 

【讨论】:

谢谢亚历克斯!我试试看能不能重现官方客户端的行为。 我认为这不是 TomTastche 所期望的答案。我会在下面回答【参考方案2】:

XEP-0280 定义了这一点。据我了解,它定义了当其中一个用户向任何人发送消息时通知来自同一用户的所有资源的机制。我的意思是,Alice/pda 向 Bob 发送消息,因此 Alice/mobile 和 Alice/PC 将收到 Alice/pda 发送的消息的副本。

希望对您有所帮助。我目前正在寻找实现此功能的服务器以及客户端库。如果没有,我会在 jabberd2 和 gloox xmpp 库中自己实现。

干杯,

【讨论】:

很遗憾,我无法使用 Google 的服务器使其正常工作...感谢您的回答! 最后我自己解决了这个问题...我刚刚在message标签中创建了一个新标签,称为replica:...... ...。我将此消息发送给自己,我的所有资源都将作为我自己的消息接收它们。我知道这很棘手,但这是我目前唯一能做的事情,因为 XEP-0280 并未在大多数服务器实现和客户端库中实现。 这适用于所有 XMPP 服务器?甚至使用 Google 的服务器?

以上是关于Google Talk 如何跨设备复制消息?的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 中的 Google Talk 中检索离线消息和聊天历史记录

如何获取 Google Talk 聊天客户端的电子邮件(默认 IM)而不是公共 IM

无法在 Android 设备上使用 asmack 15 登录 Google Talk

如何检索 Google-talk 用户的 id

Google Talk 是不是实施了 XEP-0079?

无缝构建跨设备体验 | Google I/O 大会精彩回顾