带有 socket.io 的单页应用程序中的特定于部分的侦听器

Posted

技术标签:

【中文标题】带有 socket.io 的单页应用程序中的特定于部分的侦听器【英文标题】:Section-specific listeners in single page app with socket.io 【发布时间】:2013-09-05 02:35:29 【问题描述】:

我正在构建一个具有一些实时功能(通知、实时 cmets 等,当然还有经典聊天室)的应用程序。 它的结构是一个单页应用程序。我正在使用page.js 来处理路由、require.js,以及目前一个简单的自定义 mvc 框架。带有 node 和 socket.io 的后端用于实时支持。

问题是,我有不同的部分,比如主页、帖子、聊天。每个部分都是根据路线动态呈现的。现在,我应该如何为每个部分绑定特定的套接字事件?我不想听与当前观看部分无关的事件。每次用户更改部分时,我是否应该创建一个新连接,以不同的命名空间为目标?或者我应该删除套接字中的所有事件侦听器,并附加一组新事件?我不知道最好的方法是什么,或者 socket.io 是否是最好的选择。

谢谢。

【问题讨论】:

你查看过命名空间socket.io/#how-to-use 吗? 是的,这就是为什么我问每次用户更改部分时创建一个新连接是否是个好主意,针对不同的命名空间......或者我想错了:/ 为什么要新建连接?它是单页的权利(这意味着您正在使用 ajax 来加载部分)? 如果我在,比如说,家庭部分,我有一个io.connect('/home')。如果我切换到帖子部分,我不应该创建一个到 '/posts' 的新连接吗? 【参考方案1】:

哇。我在 google 中发现了这个问题,我意识到我从未发布过我的解决方案。

感谢this answer,我解决了使用房间而不是命名空间的问题。因此,当用户更改部分时,套接字会发出“changeSection”事件。在服务器端,我离开旧部分对应的房间并加入新的房间:

io.sockets.on('connection', function (socket)
  socket.on('changeSection', function (section)
    // Leave all previous rooms
    for (var room in io.sockets.manager.roomClients[socket.id]) socket.leave(room.slice(1));
    // Join new
    socket.join(section);
  );
);

然后我将特定部分的事件(如通知、新的 cmets、聊天消息)发送到相应的房间。

【讨论】:

以上是关于带有 socket.io 的单页应用程序中的特定于部分的侦听器的主要内容,如果未能解决你的问题,请参考以下文章

React在哪里放置一个带有侧边菜单的单页应用程序的登录页面

带有 HTML5 应用缓存的单页应用的 Nginx 配置

App Engine + Polymer.dart 带有 hashbang 的单页 Web 应用路由

Redis中的单线程模型

android中所有活动的单socket.IO连接

特定版本为 False 时的特定于版本的程序集引用