使用sockjs (node.js, socket.io)的通道



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

socket.io中,我能够使用相同的连接轻松地在几个"通道"上发送消息

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

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

谢谢

我真的很喜欢primus库团队所采取的方向,因为现在在套接字实现方面有太多的混乱。它们允许你在几个最流行的websocket库(包括sockJS)之间自由切换,而不需要额外的代码。

你可以使用primus与社区插件室来完成你想做的事情。

插件允许你做这样的事情:

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

火花的工作原理与插座几乎相同。当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' } );
});

请注意,在primus中使用sockJS有一些注意事项。这些警告不会像你描述的那样影响你的处境。

就我个人而言,我已经成功地将优秀的旧ws库与primus结合起来,获得了这些不错的特性。它提供了RFC 6455兼容的套接字,这有助于在多个平台上连接客户端。

更新

0 是对评论中关于客户端过滤房间的问题的回应,如下:

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

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

然后,查看链接的文档,了解在生产环境中需要做些什么来支持需要访问客户机上的primus库的情况。

第二个,看看primus-rooms客户端/服务器的例子,看看如何设置。您可以使用此方法向特定房间广播消息。

我们的团队遇到了非常相似的设计问题,前几天我们刚刚完成了一个库的0版本,它应该可以帮助您。文档可能需要做一些工作,但是测试通过了,所以如果您愿意,它应该处于一个可供您随意使用的状态。我们选择实现发布-订阅功能而不是事件,因为我们的东西通常在水平扩展环境中运行,而事件无论如何都必须在发布-订阅之上实现。该库位于express、redis和sockjs之上,并提供了简单的令牌认证逻辑、RPC api接口和通过redis发布-订阅。

请随意提交任何问题票或功能请求,我们非常愿意更改它。这是一个令人遗憾的插座。IO不受支持,因为社区对多路复用等扩展的支持非常方便。希望这有助于消除一些障碍,使sockjs快速启动和运行。

https://github.com/azuqua/node-token-sockjs

https://github.com/azuqua/jquery-token-sockjs

最新更新