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

时间:2013-05-06 05:06:29

标签: node.js websocket socket.io sockjs engine.io

目前node.js有一个plethora of websocket libraries,最受欢迎的似乎是:

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

如果我们或某人能够汇总一个答案,作为指导使用哪个套接字库以及何时进行比较,那就太棒了。

3 个答案:

答案 0 :(得分:375)

通过这个community wiki答案让球滚动。随着您的改进,请随意edit me

  • ws node.js的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 用于浏览器的nod​​e.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个核心的xlarge Amazon EC2实例,则可以在单个实例上处理近32倍的流量。

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

何时使用:

  • 如果要在客户端使用本机WebSocket实现,请使用基本WebSocket服务器,请注意browser incompatabilities

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

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

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

在哪里测试:

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

答案 1 :(得分:39)

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

  

Socket.IO v0.9已经过时且有点儿错误,而Engine.IO就是   临时继任者。 Socket.IO v1.0(即将发布)将会   使用Engine.IO并且比v0.9要好得多。我建议你使用   Engine.IO直到Socket.IO v1.0发布。

     

“ws”不支持回退,因此如果客户端浏览器不支持   支持websockets,与Socket.IO和Engine.IO不同,它不起作用   如果没有websockets,它使用长轮询等。然而,   “ws”似乎是目前最快的图书馆。

     

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

答案 2 :(得分: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");