2

我们有一个站点,我们使用 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 的默认行为。

4

2 回答 2

4

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

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

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

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

于 2010-10-29T04:01:49.830 回答
1

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

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

于 2010-10-31T18:31:28.030 回答