【问题标题】:XMPP: how to request server for presence status of a user's contacts?XMPP:如何向服务器请求用户联系人的在线状态?
【发布时间】:2011-05-01 02:30:20
【问题描述】:

我们有一个站点,我们使用 strophe.js 库和 ejabberd XMPP 服务器为其开发了一个聊天系统。我们使用由 PHP 启动的会话附件(使用内部库)。我们所做的是从 PHP 脚本中获取 RID 和 SID,然后使用 strophe 的会话附件。所述 RID 和 SID 存储在 cookie 中,并且每次更新 strophe.js 上的 RID 时都会更新 cookie 上的 RID 值。

这很好用,登录后我们会收到每个联系人的在线状态。这样做的问题是,当您转到站点上的另一个页面并使用上述 RID(我们使用 strophe 产生的增量值)和 SID 附加时,服务器将不再发送您的联系人的存在信息,而不是当您登录时。这导致我们的联系人区域即使在线,也显得完全不可见。只有当您(或您的联系人)退出聊天,然后再次登录时,它们才会在线显示(因为您将从 XMPP 服务器收到状态更新)。

我编写了一个解决方法,当从服务器接收到状态时,您的联系人的状态会保存在 cookie 中(所有在线联系人的 JID 都会保存在 cookie 中)。每次页面加载都会检查这个,如果设置了 cookie,它将被读取,并且 cookie 上的所有 JID 都将被标记为在线。这工作正常,但可能有一些更好的方法来解决这个问题,使用 XMPP 的默认行为。

【问题讨论】:

    标签: xmpp ejabberd strophe


    【解决方案1】:

    当您将自己的初始状态发送到服务器时,XMPP 服务器会代表您向所有联系人发送状态探测。从那时起,您将只会收到来自您的联系人的在线状态更改。

    如果您丢失了联系人的在线状态,您将需要发送自己的在线探测以重新建立该状态。但是,这可能不是您经常想做的事情,并且在大多数情况下可能更喜欢绕过存在状态。

    您可以尝试通过 XMPP 传递状态。例如,您可以使用私有 XML 存储 (XEP-0049)、Pubsub (XEP-0060) 或 PEP (XEP-0163)。

    在客户端传递它而不是 cookie 的另一个选项是使用 HTML5 SharedWorker 对象来保存状态。

    【讨论】:

    • 我无法为这个项目使用任何 HTML 功能,因为浏览器兼容性很重要(IIRC 工作对象仅在 webkit 浏览器上完全工作?)。所以我想我会尝试 PEP 或 XEP-0049。谢谢!
    【解决方案2】:

    想到与将您刚刚从服务器接收到的所有存在存储回私有存储中的服务器相关的规模属性,我不寒而栗。私有存储几乎总是支持长期存储而不是存储在内存中,因此您将把服务器的磁盘磨成灰尘。

    如果您想在浏览器中存储更多状态,并与浏览器版本隔离,并且您已经在使用 jQuery,那么jStore 非常不错。

    【讨论】:

    • 感谢您提供的信息。如果私有存储真的在磁盘上,那么它就没有选择的余地了。 PEP 仍然是我的首选,仅次于 cookie 存储。因为我检查了 jStore 浏览器的兼容性,我发现只有齿轮和闪存选项在兼容性方面非常好。 Gears 已经过时了,因为它已经被弃用了,所以闪存是唯一的选择。最好使用更轻量级的 cookie。
    • 只有 IE6 需要 Flash。所有其他浏览器都有更好的选择。您可以将 jStore 设置为选择当前浏览器上可用的最佳版本。
    • 我明白了。谢谢你的回答。如果我不能用 PEP 做到这一点,会调查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2010-11-25
    相关资源
    最近更新 更多