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

时间:2014-05-13 15:17:21

标签: node.js websocket socket.io sockjs

我注意到socket.io有很多问题(内存泄漏,CPU使用情况等),因此我将我的应用程序转换为sockjs(或者别的......如果这转向难以实施)。

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

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

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

谢谢

2 个答案:

答案 0 :(得分:6)

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

你可以将primus与社区插件rooms一起使用来完成你想要做的事情。

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

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

火花的工作方式与插座几乎相同。只要primus接收到连接,它就会给你一个火花对象进行操作。所以,这是一个完整的例子:

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有一些caveats。这些警告不会像您所描述的那样影响您的情况。

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

更新0 是对客户端过滤室评论中的问题的回应,如下:

首先,根据用于客户端使用primus的documentation,您需要访问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方法向特定房间广播消息。

答案 1 :(得分:3)

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

随时提交任何问题门票或功能请求,我们非常愿意更改它。这是一个耻辱socket.io不受支持,因为社区支持扩展,如多路复用真的很方便。希望这有助于消除使袜子快速启动和运行的一些障碍。

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

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