Welche Websocket-Bibliothek soll mit Node.js verwendet werden? [geschlossen]

429

Derzeit gibt es eine Vielzahl von Websocket-Bibliotheken für node.js. Die beliebtesten scheinen zu sein:

Allerdings kann ich keine konkreten Vergleiche zwischen ihnen finden ... Anscheinend war Socket.io fantastisch, ist aber ziemlich veraltet und hat fehlerhafte Builds. Sowohl ws als auch websocket-node behaupten, dass sie die schnellsten sind. Und engine.io scheint neu zu sein, aber viel schwerer als die leichteren Aletarntives.

Es wäre erstaunlich, wenn wir oder jemand eine Antwort zusammenstellen könnte, die als Leitfaden für die zu verwendende Socket-Bibliothek und wann sowie als Vergleich zwischen ihnen dient.

Balupton
quelle
246
Wenn dies geschlossen wird, wohin sollte eine solche Frage gehen? Da die Antwort unglaublich nützlich sein wird ... Scheint bedauerlich, dass eine so wichtige Frage hier nicht stehen sollte.
Balupton
14
Woot woot für Community-Wikis, was bedeutet, dass wir die Community-Wiki-Antwort unten verbessern können, obwohl die Frage aufgrund neuer Antworten geschlossen wurde :)
Balupton
14
Ich stimme zu, ich würde gerne sehen, dass diese Art von Frage nicht nur erlaubt, sondern ermutigt wird. OK, sie mögen in einem Jahr nicht mehr relevant sein, aber bis dahin werden sie die Welt retten.
John Little
1
@balupton kannst du die Community mit deiner Wahl aktualisieren und wenn du damit zufrieden bist? ist es socket.io?
C Grafiken
3
@Cgraphics Ich benutze Primus heutzutage mit ws, da ws alles ist, was ich brauche. Wenn ich etwas Extremeres brauche, tausche ich einfach die Bibliothek aus und behalte dank Primus die gleiche API. Wirkt Wunder.
Balupton

Antworten:

390

Mit dieser Community-Wiki- Antwort den Ball ins Rollen bringen . Fühlen Sie sich frei , mich mit Ihren Verbesserungen zu bearbeiten .

  • ws WebSocket Server und Client für node.js. Eine der schnellsten Bibliotheken, wenn nicht die schnellste.

  • websocket-node WebSocket-Server und -Client für node.js

  • Websocket-Treiberknoten WebSocket-Server und Client-Protokoll-Parser node.js - werden in faye-websocket-node verwendet

  • faye-websocket-node WebSocket-Server und -Client für node.js - wird in faye und sockjs verwendet

  • socket.io WebSocket-Server und -Client für node.js + Client für Browser + (v0 hat die neuesten bis ältesten Fallbacks, v1 von Socket.io verwendet engine.io) + Kanäle - werden in stack.io verwendet. Die Clientbibliothek versucht, die Verbindung nach dem Trennen wieder herzustellen.

  • sockjs WebSocket-Server und -Client für node.js und andere + Client für Browser + neueste bis älteste Fallbacks

  • faye WebSocket Server und Client für node.js und andere + Client für Browser + Fallbacks + Unterstützung für andere serverseitige Sprachen

  • Clusterfähiger Echtzeitserver deepstream.io, der WebSockets- und TCP-Verbindungen verarbeitet und Datensynchronisation, Pub / Sub und Request / Response bietet

  • Socketcluster WebSocket-Servercluster, der alle CPU-Kerne auf Ihrem Computer verwendet. Wenn Sie beispielsweise eine xlarge Amazon EC2-Instanz mit 32 Kernen verwenden, können Sie den 32-fachen Datenverkehr auf einer einzelnen Instanz verarbeiten.

  • primus Bietet eine gemeinsame API für die meisten der oben genannten Bibliotheken für einfaches Umschalten und Stabilitätsverbesserungen für alle.

Wann zu verwenden:

  • Verwenden Sie die grundlegenden WebSocket-Server, wenn Sie die nativen WebSocket-Implementierungen auf der Clientseite verwenden möchten. Achten Sie auf die Inkompatibilitäten des Browsers

  • Verwenden Sie die Fallback-Bibliotheken, wenn Sie sich für Browser-Fallbacks interessieren

  • Verwenden Sie die Bibliotheken mit allen Funktionen, wenn Sie sich für Kanäle interessieren

  • Verwenden Sie primus, wenn Sie keine Ahnung haben, was Sie verwenden sollen, nicht in der Stimmung sind, Ihre Anwendung neu zu schreiben, wenn Sie aufgrund sich ändernder Projektanforderungen das Framework wechseln müssen oder zusätzliche Verbindungsstabilität benötigen.

Wo zu testen:

Firecamp ist eine GUI-Testumgebung für SocketIO, WS und alle wichtigen Echtzeittechnologien. Debuggen Sie die Echtzeitereignisse, während Sie sie entwickeln.

Balupton
quelle
10
Danke für die ausführliche Antwort. Können Sie Punkt 3 in der Verwendung erklären? Auf welche Kanäle bezieht sich der Punkt? Ich bin neu in Websockets und versuche zu verstehen, welche ich in meinem Fall verwenden soll.
Akshat Jiwan Sharma
2
Was ist mit Autobahn / WAMP?
Emile Cormier
1
Schöne Liste aller verfügbaren Optionen nach dem Tod von now.js
Rahul Prasad
@AkshatJiwanSharma: Kanäle sind die sogenannten "Räume", in denen jeder Spieler in einem Raum Nachrichten austauschen kann.
Marwen Trabelsi
4
Ein kleines Detail für ws ist, dass es Python braucht. Wenn Sie also auf Docker-Containern oder Ähnlichem bereitstellen, muss Python verfügbar sein ws.
AntouanK
40

Update: Diese Antwort ist veraltet, da seitdem neuere Versionen der genannten Bibliotheken veröffentlicht werden.

Socket.IO v0.9 ist veraltet und etwas fehlerhaft, und Engine.IO ist der vorläufige Nachfolger. Socket.IO v1.0 (das bald veröffentlicht wird) verwendet Engine.IO und ist viel besser als v0.9. Ich würde Ihnen empfehlen, Engine.IO zu verwenden, bis Socket.IO v1.0 veröffentlicht wird.

"ws" unterstützt kein Fallback. Wenn der Client-Browser keine Websockets unterstützt, funktioniert dies nicht, im Gegensatz zu Socket.IO und Engine.IO, die Long-Polling usw. verwenden, wenn keine Websockets verfügbar sind. "Ws" scheint derzeit jedoch die schnellste Bibliothek zu sein.

Siehe meinen Artikel zum Vergleich von Socket.IO, Engine.IO und Primus: https://medium.com/p/b63bfca0539

Deniz Ozger
quelle
Dies erinnert mich an die üblichen Node.js 0.12 ist sofort ... sie behaupten auch, dass seit Monaten. Also müssen wir wahrscheinlich abwarten und sehen ...
Golo Roden
1
Haben Sie Einblicke / Erfahrungen mit Autobahn / WAMP ( wamp.ws )?
Emile Cormier
6
Socket.IO hat seine Version 1 veröffentlicht. Engine.io ist kein Ersatz dafür, sondern wird intern von Socket.IO als Transportprotokoll verwendet. Es abstrahiert die tatsächliche Kommunikation zwischen Endpunkten (xhr, ws) und verfügt über ein einfaches Format für Pakete. Socket.io bietet eine reichhaltigere API, die sich wie ein Ereignisemitter über das Kabel "anfühlt".
Hammett
29

npm ws war die Antwort für mich. Ich fand es weniger aufdringlich und direkter. Damit war es auch trivial, Websockets mit Rest-Services zu mischen. Gemeinsamer einfacher Code für diesen Beitrag.

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");
MFAL
quelle
Wie bekomme ich eine Anforderungs-URL in der Verbindungsmetod? wss.on ("Verbindung", Funktion (ws) {// einige Code console.log (ws. ???) bekommen URL ...}
Opalosolo
Es gibt keine Anforderungs-URL wie bei Ajax-Anforderungen. Die Javascript-Bibliothek stellt eine Verbindung zu Ihrem Web-Socket-Server unter der Adresse 127.0.0.1:8080 oder irgendetwas.com:7777 usw. her. Es klingt verwirrend, versuchen Sie, ein einfaches Tutorial über Web-Sockets durchzugehen.
MFAL
5
Tatsächlich haben WebSocket-Endpunkte auch eine URL, mit der sie beginnen ws, z ws://myserver.com. Und ja, sie können so konfiguriert werden, dass sie auch über 80 und 443 Ports bedient werden. Mit einem Reverse-Proxy wie nginx können Sie die WebSocketProtokoll-URLs von den normalen HTTP-Protokollen an einen anderen Port weiterleiten.
Prahlad Yeri
Sie können Routen simulieren, wenn Sie möchten.
Lucas Tettamanti
1
Mit express-wsermöglicht das Hinzufügen von wsRouten in der Express-App.
Dmitry Masley