哪个websocket库与Node.js一起使用?

bal*_*ton 419 websocket node.js socket.io sockjs engine.io

目前node.js 有大量的websocket库,最流行的似乎是:

然而,我找不到任何一个之间的任何具体的具体比较...显然Socket.io很棒,但已经过时了,并且已经失败了.ws和websocket-node都声称它们是最快的.而engine.io似乎是新的,但比较轻的aletarntives重得多.

如果我们或某人能够将一个答案作为指导,使用哪个套接字库以及何时使用它们,以及它们之间的比较,那将是惊人的.

bal*_*ton 383

通过这个社区维基回答滚动球.随意编辑我的改进.

  • WS 的WebSocket服务器和客户端的node.js中 如果不是最快的库之一,最快的库之一.

  • websocket-node 用于node.js的WebSocket服务器和客户端

  • websocket-driver-node WebSocket服务器和客户端协议解析器node.js - 用于faye-websocket-node

  • faye-websocket-node用于node.js的WebSocket服务器和客户端 - 用于faye和sockjs

  • socket.io 用于browser.js的客户端和用于浏览器的客户端+(v0具有最新到最旧的回退,Socket.io的v1使用engine.io)+通道 - 在stack.io中使用.客户端库尝试在断开连接时重新连接.

  • sockjs 用于node.js的WebSocket服务器和客户端以及用于浏览器+最新到最旧回退的客户端

  • 用于node.js和其他人的faye WebSocket服务器和客户端+用于浏览器+后备的客户端+支持其他服务器端语言

  • deepstream.io可集群实时服务器,用于处理WebSockets和TCP连接,并提供数据同步,发布/ 订阅和请求/响应

  • socketcluster WebSocket服务器集群,它使用您计算机上的所有CPU核心.例如,如果您要使用具有32个核心的xlarge Amazon EC2实例,则可以在单个实例上处理几乎32倍的流量.

  • primus为上面的大多数库提供了一个通用的API,以便为所有库提供简单的切换+稳定性改进.

何时使用:

  • 当你想在客户端使用本机WebSocket实现时使用基本的WebSocket服务器,要小心浏览器的不兼容性

  • 在关心浏览器回退时使用回退库

  • 在关心频道时使用全功能库

  • 当您不知道要使用什么时,请使用primus,当您因为更改项目要求或需要额外的连接稳定性而需要切换框架时,无需重写应用程序.

在哪里测试:

Firecamp是SocketIO,WS和所有主要实时技术的GUI测试环境.在开发实时事件时调试它们.

  • 谢谢你的详细解答.你能解释一下何时使用的第3点.这一点涉及的渠道是什么?我是websockets的新手,我试图理解在我的情况下使用哪一个. (9认同)
  • [ws](https://github.com/einaros/ws)的一个小细节是它需要python.因此,如果您在docker容器或其他东西上部署,则需要使用python来使用`ws`. (4认同)
  • 那么高速公路/ WAMP呢? (2认同)

Den*_*ger 40

更新:此答案已过时,因为此后提到的新版本的库已发布.

Socket.IO v0.9已经过时且有点儿错误,而Engine.IO是临时继任者.Socket.IO v1.0(将很快发布)将使用Engine.IO并且比v0.9好很多.我建议您在发布Socket.IO v1.0之前使用Engine.IO.

"ws"不支持回退,所以如果客户端浏览器不支持websockets,它将无法工作,不像Socket.IO和Engine.IO使用长轮询等,如果websockets不可用.然而,"ws"似乎是目前最快的图书馆.

请参阅我的文章,比较Socket.IO,Engine.IO和Primus:https://medium.com/p/b63bfca0539

  • Socket.IO发布了它的v1.Engine.io不是它的替代品,而是由Socket.IO作为传输协议内部使用 - 它抽象端点(XHR,WS)之间的实际通信,并且具有用于数据包的简单的格式.Socket.io提供了一个更丰富的api,它"感觉"就像电线上的事件发射器. (6认同)

MFA*_*FAL 27

npm ws是我的答案.我发现它不那么具有侵入性和直接性.将websockets与休息服务混合在一起也很简单.这篇文章共享简单代码.

var WebSocketServer = require("ws").Server;
var http = require("http");
var express = require("express");
var port = process.env.PORT || 5000;

var app = express();
    app.use(express.static(__dirname+ "/../"));
    app.get('/someGetRequest', function(req, res, next) {
       console.log('receiving get request');
    });
    app.post('/somePostRequest', function(req, res, next) {
       console.log('receiving post request');
    });
    app.listen(80); //port 80 need to run as root

    console.log("app listening on %d ", 80);

var server = http.createServer(app);
    server.listen(port);

console.log("http server listening on %d", port);

var userId;
var wss = new WebSocketServer({server: server});
    wss.on("connection", function (ws) {

    console.info("websocket connection open");

    var timestamp = new Date().getTime();
    userId = timestamp;

    ws.send(JSON.stringify({msgType:"onOpenConnection", msg:{connectionId:timestamp}}));


    ws.on("message", function (data, flags) {
        console.log("websocket received a message");
        var clientMsg = data;

        ws.send(JSON.stringify({msg:{connectionId:userId}}));


    });

    ws.on("close", function () {
        console.log("websocket connection close");
    });
});
console.log("websocket server created");
Run Code Online (Sandbox Code Playgroud)

  • 实际上WebSocket端点也有url,它们以`ws`开头,例如`ws:// myserver.com`.是的,它们也可以配置为使用80和443端口.使用像nginx这样的反向代理,您可以将`WebSocket`协议URL从正常的HTTP协议路由到另一个端口. (5认同)