我注意到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