是否有仅用于传输的 socket.io 的轻量级替代方案?
我有一个 node.js 应用程序,它仅使用 socket.io 作为消息传输。我的应用程序自己管理会话和消息路由,我只是使用 socket.io 进行传输——websocket + 旧浏览器的默认回退。
较新版本的 socket.io 似乎越来越重,现在带有 redis 支持,我完全不需要。
ws模块速度惊人(查看基准测试),经过良好测试,非常非常轻量级,但是没有你必须自己做后备,另外,它上面没有事件发射器。但是,如果这是您想要的,那么仅在运输方面就很棒。如果你想要一个穷人的“会话”,只需在 ws 对象上附加一些东西,如下所示:
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer( /* some config */);
wss.on('connection', function(ws) {
ws.on('message', function (message) {
try {
var obj = JSON.parse(message) // using JSON over the conversation
} catch (err) {
var obj = {};
console.log('probably not valid json');
}
switch (true) {
case obj.name !== undefined:
ws.name = obj.name; // Here's the poor man's session variable
ws.send('Hello '+ws.name);
break;
}
});
});
现在唯一缺少的是它上面的事件发射器......
还有其他选择。faye
- http://faye.jcoglan.com/就是其中之一。它类似于 socket.io,但使用Bayeux
协议。另一个如果您不想运行服务器pusher
- http://pusher.com/。
看看sock.js——它试图实现跨浏览器的 websockets api,仅此而已。
对于 Node.js,您可以尝试ws + ws-wrapper + ws-server-wrapper。ws-wrapper 是一个轻量级库,它为 WebSockets 添加了一些事件处理程序功能......类似于您在 socket.io 中可能找到的内容。此外,您还可以获得基于 Promise 的请求和命名空间。
正如其他人所提到的,ws模块非常快速、轻量级,甚至被 socket.io 在后台使用。所有现代浏览器现在都支持原生 WebSocket ,因此为大多数实时 Web 应用程序支持其他传输似乎很愚蠢。
ws-wrapper
甚至没有实现自动重新连接,所以如果你想要,请查看描述指数回退方法的 wiki 页面
最后,ws-server-wrapper 是服务器端的库,允许您执行以下操作:向所有连接的 WebSocket 发送消息,侦听来自所有 WebSocket 的事件等。
免责声明:我是 ws-wrapper 的作者。:)