我们有一个网站,我们使用strophe.js库和ejabberd XMPP服务器为它开发了一个聊天系统。我们使用由PHP启动的会话附件(使用内部库)。我们所做的是从PHP脚本中获取RID和SID,然后使用strophe的会话附件。所述RID和SID存储在cookie上,并且每次更新strophe.js上的RID时,cookie上的RID值都会更新。 (这样我们就可以将页面刷新/导航上的会话ID重用到网站上的其他位置)
我们现在计划让它在多个标签/窗口上运行。我观察了Facebook的实现,并且对于每个选项卡,对某个域都有一个很长的轮询请求。每个选项卡的域名都不同。例如,选项卡一将是0.86.channel.facebook.com。第二个标签是1.86.channel.facebook.com。据我所知,这是解决浏览器限制2个活动请求到某个域。这个多域解决方案是如何实现的?
接下来将是聊天会话本身。每个标签的聊天会话会有所不同吗? UI如何与Facebook等每个标签同步?我的想法是,根据每个操作,将向用户自己的JID发送一条消息,其中包含与聊天相关的操作。例如,打开聊天窗口会发送一个消息节,如下所示:
<message from="my_own_jid" to="my_own_jid" type="chat">
<body>{"jid-of-contact":"open-chat-box"}</body>
</message>
这将在聊天客户端上捕获,UI将相应调整(在这种情况下,打开联系人的聊天框)。
对此实施的任何建议/意见?
谢谢!
答案 0 :(得分:8)
我和我的团队正在研究完全相同的问题 - 只是我们使用Openfire而不是Ejabberd(主要是因为我们有Java技能但不熟悉Erlang)。我们公司正在构建浏览器游戏。
我们的解决方案包括:
我们使用旁遮普,因为Openfire的BOSH实现最初与其他组件的效果似乎不太好。
基本上我们决定不为每个标签创建一个会话。这是因为我们的一些游戏按照常规网站的方式工作:点击链接会请求一个完整的新页面(而较新的游戏完全在ajax中工作,大多数GUI保持不变)。换句话说:我们基于网络的聊天必须在用户“在网站上移动”的环境中工作。一个选项卡的一个会话意味着每个页面请求的新会话,这似乎是一个巨大的开销,因为玩家经常很快点击。所以 - 我们希望创建一个会话并坚持玩家。
为了解决这个问题,我们 - 像你一样 - 修改了strophe.js来读取/保存cookie中的RID,因此所有标签都知道当前的RID并增加到正确的值。另一件事是,我们让Strophe在XMPP节的正文中添加了一个CID。 CID就像客户ID一样。我会尽快解释一下这个用途。
接下来的计划是在旁遮普省修改两件事。首先,我们添加了一个类,它取代了等待请求存储在旁遮普中的通常方式。等待BOSH请求现在保存在带有CID的字典中(strophe.js现在添加到每个请求的正文中)作为密钥。当来自相同标签的另一个请求到达旁遮普时,则知道哪个等待请求发送空答案。如果有新节将被发送,旁遮普将把这些发送给字典中的所有等待请求。因此,传入的消息将分发到所有选项卡。其次,我们添加了几行,以便从一个选项卡发送的消息立即“返回”到所有其他选项卡。因此,该消息也可以显示在其他标签历史记录中。
当然还有其他问题需要面对,例如当玩家移动到下一个屏幕时不会丢失GUI中的聊天记录。将其存储在cookie中会很糟糕,因为所有这些内容都会随着每个请求发送出去并导致大量流量。为此我们考虑实现类似于XEP-0136消息归档的东西。
所以简而言之,我们必须处理修补/扩展strophe.js和旁遮普,我们正在修改标准。但它现在工作正常,我很高兴看到这个设置将如何在测试中发挥作用。
答案 1 :(得分:3)
我的解决方案:
每个标签在不同的资源上都有自己的连接,优先级为1。
在openfire中添加服务器变量route.all-resources: true
消息将被广播到所有资源。