XMPP:如何向服务器请求用户联系人的状态?

时间:2010-10-27 04:15:42

标签: xmpp ejabberd strophe

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

2 个答案:

答案 0 :(得分:4)

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

如果您丢失了联系人的状态,则需要发送自己的状态探测以重新建立该状态。但是,这可能不是你想要做的很多事情,在大多数情况下,传递状态可能是首选。

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

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

答案 1 :(得分:1)

我不禁想到将您刚刚从服务器收到的所有状态存储回私有存储中的服务器的规模属性。私有存储几乎总是支持长期存储,而不是存储在内存中,所以你要将服务器的磁盘磨到灰尘。

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