【问题标题】:Which websocket library to use with Node.js? [closed]哪个 websocket 库与 Node.js 一起使用? [关闭]
【发布时间】:2013-04-29 19:48:54
【问题描述】:

目前node.js有一个plethora of websocket libraries,最流行的好像是:

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

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

【问题讨论】:

  • 如果关闭,这样的问题应该去哪里?因为答案将非常有用......似乎很不幸,如此突出的问题不应该存在于此。
  • Woot woot 社区 wiki,这意味着尽管问题已从新答案中关闭,但我们仍然可以改进以下社区 wiki 答案:)
  • 我同意,我希望看到这种问题不仅被允许,而且被鼓励。好吧,它们可能在几年内不再相关,但在那之前它们将拯救世界。
  • @balupton 你能用你的选择更新社区吗?如果你对它感到满意?是socket.io吗?
  • @Cgraphics 这些天我将 Primus 与 ws 一起使用,因为我只需要 ws,如果我需要更极端的东西,我只需更换底层库并保留相同的 api,这要感谢 Primus。创造奇迹。

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


【解决方案1】:

用这个community wiki 答案让球滚动起来。请随时 edit me 了解您的改进。

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

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

  • websocket-driver-nodeWebSocket服务端和客户端协议解析器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 可集群的实时服务器,处理 WebSocket 和 TCP 连接并提供数据同步、发布/订阅和请求/响应

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

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

何时使用:

  • 当您想在客户端使用本机 WebSocket 实现时,请使用基本 WebSocket 服务器,注意browser incompatibilities

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

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

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

在哪里测试:

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

【讨论】:

  • 感谢您的详细回答。您能解释一下何时使用第 3 点吗?该点所指的渠道是什么?我是 websockets 的新手,正在尝试了解在我的情况下使用哪一个。
  • 高速公路/WAMP 怎么样?
  • now.js 死后所有可用选项的好列表
  • @AkshatJiwanSharma:Channels 是所谓的“房间”,房间中的每个玩家都可以交换消息。
  • ws 的一个小细节是它需要 python。所以如果你部署在 docker 容器或其他东西上,你需要有 python 来使用ws
【解决方案2】:

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

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

【讨论】:

  • 这让我想起了通常的 Node.js 0.12 是即时的 ......他们也声称这几个月了。所以,很可能,我们将不得不拭目以待……
  • 您对 Autobahn/WAMP (wamp.ws) 有任何见解/经验吗?
  • Socket.IO 发布了 v1。 Engine.io 不是它的替代品,而是由 Socket.IO 在内部用作传输协议 - 它抽象了端点(xhr,ws)之间的实际通信,并具有简单的数据包格式。 Socket.io 提供了一个更丰富的 api,“感觉”就像是一个事件发射器。
【解决方案3】:

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... }
  • 没有 ajax 请求中的请求 url。 javascript 库使用诸如 127.0.0.1:8080 或anything.com:7777 等地址打开与您的网络套接字服务器的连接...。听起来很混乱,请尝试阅读一些有关 web-sockets 的简单教程。
  • 其实WebSocket端点也有url,以ws开头,比如ws://myserver.com。是的,它们也可以配置为使用 80 和 443 端口提供服务。使用像 nginx 这样的反向代理,您可以将 WebSocket 协议 url 从正常的 HTTP 协议路由到另一个端口。
  • 您可以根据需要模拟路线。
  • 使用express-ws允许在快递应用中添加ws路线。
猜你喜欢
  • 2011-12-20
  • 2013-12-18
  • 1970-01-01
  • 2010-09-24
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多