与Node.js一起使用哪个websocket库?[关闭]


429

当前,有大量用于node.js 的Websocket库,最受欢迎的似乎是:

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

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


246
如果这个问题解决了,这样的问题应该去哪儿?因为答案将非常有用。。。不幸的是,这样一个突出的问题不应该放在这里。
balupton

14
恳求社区Wiki,这意味着尽管这个问题不再有新答案,但我们仍然可以改善以下社区Wiki的答案:)
balupton

14
我同意,我希望看到这样的问题不仅可以接受,而且可以鼓励。好的,它们可能在几年之内不相关了,但是在那之前它们将拯救世界。
约翰·利特尔

1
@balupton是否可以根据您的选择更新社区,如果您对此感到满意?是socket.io吗?
C图形卡

3
@Cgraphics这些天我在ws上使用Primus,因为ws是我所需要的,如果我需要更极端的东西,我只是换出了底层库,并感谢Primus保留了相同的api。创造奇迹。
balupton

Answers:


390

通过这个社区Wiki答案获得成功。随时根据您的改进来编辑我

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

  • websocket节点 WebSocket服务器和node.js的客户端

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

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

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

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

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

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

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

  • primus为上述大多数库提供一个通用API,以实现所有库的轻松切换和稳定性改进。

何时使用:

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

  • 在关注浏览器后备时使用后备库

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

  • 当您不知道要使用什么时,可以使用primus;当由于项目需求变化或需要额外的连接稳定性而需要切换框架时,则不打算重写应用程序。

在哪里测试:

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


10
感谢您的详细回答。您能否在使用时解释第3点。该点所指的渠道是什么?我是websockets的新手,正在尝试了解在我的情况下使用哪个。
Akshat Jiwan Sharma,

2
高速公路/ WAMP呢?
Emile Cormier 2014年

1
now.js去世后所有可用选项的详细清单
Rahul Prasad

@AkshatJiwanSharma:渠道是所谓的“房”在一个房间里每个玩家都可以交换消息..
Marwen特拉贝尔西

4
ws的一个小细节是它需要python。因此,如果您部署在Docker容器之类的东西上,则需要使用python来使用ws
AntouanK 2015年

40

更新:此后,由于提到的较新版本的库已发布,此答案已过时。

Socket.IO v0.9已过时且有故障,而Engine.IO是其后继产品。Socket.IO v1.0(即将发布)将使用Engine.IO,并且比v0.9更好。我建议您使用Engine.IO,直到Socket.IO v1.0发布为止。

“ ws”不支持回退,因此,如果客户端浏览器不支持websocket,则它将不起作用,这与Socket.IO和Engine.IO不同,如果Websocket不可用,Socket.IO和Engine.IO将使用长轮询等。但是,“ ws”似乎是目前最快的库。

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


这让我想起了通常的Node.js 0.12是即时的 …他们也声称这种情况已经持续了几个月。因此,也许我们将不得不拭目以待……
Golo Roden 2014年

1
您对高速公路/ WAMP(wamp.ws)有任何见解/经验吗?
Emile Cormier 2014年

6
Socket.IO发布了其v1。Engine.io不能替代它,但是由Socket.IO在内部用作传输协议-它抽象了端点之间的实际通信(xhr,ws),并且具有简单的数据包格式。Socket.io提供了更丰富的api,就像通过网络发送事件一样“感觉”到了。
hammett 2014年

29

npm ws是我的答案。我发现它不那么麻烦,更直截了当。有了它,将websocket与其他服务混合在一起也是微不足道的。在此帖子上共享了简单的代码。

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");

如何获取连接方法中的请求URL?wss.on(“ connection”,function(ws){//一些代码console.log(ws。???)获取url ...}
Opalosolo 2015年

没有像ajax请求中那样的请求URL。javascript库使用127.0.0.1:8080或something.com:7777等地址打开到Web套接字服务器的连接。这听起来令人困惑,请尝试通过一些有关Web套接字的简单教程。
MFAL

5
实际上,WebSocket端点也有url,它们以开头ws,例如ws://myserver.com。是的,它们也可以配置为使用80和443端口进行服务。使用像nginx这样的反向代理,您可以将WebSocket协议URL从普通的HTTP协议路由到另一个端口。
Prahlad Yeri 2015年

您可以根据需要模拟路线。
卢卡斯·泰塔曼蒂

1
使用express-ws允许ws在快速应用中添加路线。
德米特里·马斯利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.