448

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

但是我在它们之间找不到任何可靠的具体比较......显然 Socket.io 很棒,但已经过时并且构建失败。ws 和 websocket-node 都声称它们是最快的。engine.io 似乎是新的,但比更轻的 altarntives 重得多。

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

4

3 回答 3

408

使用这个社区 wiki答案让球滚动起来。随时用你的改进来编辑我。

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

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

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

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

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

  • sockjs 用于 node.js 和其他的 WebSocket 服务器和客户端 + 用于浏览器的客户端 + 最新到最旧的后备

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

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

  • socketcluster WebSocket 服务器集群,它利用您机器上的所有 CPU 内核。例如,如果您要使用具有 32 个内核的超大型 Amazon EC2 实例,您将能够在单个实例上处理几乎 32 倍的流量。

  • primus为上述大多数库提供通用 API,以便于所有这些库的轻松切换和稳定性改进。

何时使用:

  • 当您想在客户端使用本机 WebSocket 实现时,请使用基本 WebSocket 服务器,请注意浏览器不兼容问题

  • 当您关心浏览器后备时使用后备库

  • 当您关心频道时,使用功能齐全的库

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

在哪里测试:

Firecamp是一个用于 SocketIO、WS 和所有主要实时技术的 GUI 测试环境。在开发时调试实时事件。

于 2013-05-06T06:20:40.067 回答
41

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

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

于 2014-01-09T12:21:36.627 回答
34

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");
于 2014-10-01T08:10:11.507 回答