node.js - 使用 sockjs 的 channel (node.js、socket.io)

标签 node.js websocket socket.io sockjs

我注意到 socket.io 有很多问题(内存泄漏、CPU 使用等),因此我正在将我的应用程序转换为 sockjs(或别的……如果这变得难以实现)。

socket.io 中,我能够使用相同的连接轻松地在多个“ channel ”上发送消息

socket.emit('news', { hello: 'world' });
socket.emit('other', { hello: 'world' });

如何使用 sockjs 实现此目的?我知道这个功能还没有在 sockjs 中实现,但是是否有一个可靠的框架可以做到这一点? 我遇到了这个 websocket-multiplex但对我在几个博客上阅读的评论不满意。

谢谢

最佳答案

我真的很喜欢团队在 primus 的方向图书馆正在采取行动,因为现在套接字实现中有太多的变动。它们允许您在几个最流行的 websocket 库(包括 sockJS)之间自由切换,而无需额外的代码。

您可以将 primus 与社区插件一起使用 rooms完成您正在尝试做的事情。

该插件将允许您执行如下操作:

spark.room('news').write( { hello : 'world' } );

Spark 的工作方式几乎与 socket 相同。每当 primus 收到连接时,它都会为您提供一个要操作的 spark 对象。所以,这是一个完整的例子:

var Primus = require('primus')
  , http = require('http');

var server = http.createServer(/* request handler */)
  , primus = new Primus(server, { transformer: 'sockjs' });

primus.on('connection', function (spark) {
  spark.room('news').write( { hello : 'world' } );
});

请注意,有几个 caveats将 sockJS 与 primus 一起使用。这些注意事项不会影响您所描述的情况。

就个人而言,我已经成功地使用了旧的 ws库与 primus 相结合以获得这些不错的功能。它为您提供符合 RFC 6455 标准的套接字,这有助于尝试连接到多个平台上的客户端。

更新 0 这是对评论中有关在客户端过滤房间的问题的回应,如下:

首先,根据documentation对于 primus 的客户端使用,您需要访问 primus 客户端 API。对于开发用途,路由会自动添加到您的 http 服务器,以便您可以在 html 中执行以下操作:

// use this to load the client-side framework in development only
<script src="/primus/primus.js"></script>

然后,看看链接的documentation对于您需要在生产中做些什么来支持您需要访问客户端上的 primus 库的情况。

其次,在 primus-rooms 客户端/服务器中探索 examples查看如何设置。您可以使用 this向特定房间广播消息的方法。

关于node.js - 使用 sockjs 的 channel (node.js、socket.io),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23635229/

相关文章:

javascript - Node.js 在控制台中打印回未定义的属性

node.js - 如何在nodejs中返回grpc错误

java - 错误: Could not find or load main class TestClient

javascript - 使用 Websocket 连接到虚拟机

socket.io - socket.io与RethinkDB changefeed

javascript - 无法在 'RTCPeerConnection 上执行 'setLocalDescription'

node.js - 如何更新 npm 本身?

node.js - Connect/node.js - 创建一个简单的服务器

ajax - 我应该使用AJAX还是WebSockets。

websocket - 在 ASP.NET Core 1.0 中使用 SignalR