【发布时间】:2011-05-01 05:20:41
【问题描述】:
我们有一个站点,我们使用 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 将相应调整(在这种情况下,为联系人打开一个聊天框)。
关于这个实现有什么建议/cmets?
谢谢!
【问题讨论】:
-
在多域上:不同的域可能只是将来自不同域的请求重新路由回它们使用的 XMPP 服务器。它可能只是浏览器端的“伪装”。关于如何在单个用户名下登录到相同的资源,嗯,我想知道 FB 是否已经实现/修改了他们用来实现这一点的 XMPP 服务器。知道会很有趣。
-
关于跨多个选项卡维护 UI 的外观和感觉:我想知道您是否可以使用 HTML5 的数据存储来维护聊天的“状态”,并让每个选项卡...数据存储?根据 XMPP 规范,您应该能够使用资源优先级来“控制”消息节将发送到的位置。想知道您是否可以利用它来实现多标签效果...
-
@DashK他们登录的是同一个资源吗?我认为这是一个不同的会话,每个会话都有不同的资源。这样就不需要修改 XMPP 服务器(并且使用相同资源为同一个用户进行多次登录是违反 XMPP 标准的,对吧?)。
-
在 HTML5 数据存储中,恐怕我无法实现它,直到它在不同的浏览器中正确实现(最后我检查了只有基于 Webkit 的浏览器完全支持这一点)。关于资源优先级,您是在谈论 XEP-0168 吗?我略读了一下,开始看到它在多标签聊天环境中的可能用途,但我在这里仍然一无所知。
-
@mives - 我不确定 FB 的 XMPP 是如何实现的。如果他们在所有不同的浏览器会话中使用完全相同的资源登录,那么他们需要有自定义代码来支持它。