Quelle bibliothèque Websocket utiliser avec Node.js? [fermé]

428

Il existe actuellement une pléthore de bibliothèques Websocket pour node.js, les plus populaires semblent être:

Cependant, je ne trouve aucune comparaison concrète solide entre l'un d'entre eux ... Apparemment, Socket.io était génial, mais est devenu assez daté et a des builds défaillants. Les deux ws et websocket-node prétendent qu'ils sont les plus rapides. Et engine.io semble nouveau, mais beaucoup plus lourd que les aletarntives plus légers.

Il serait étonnant que nous ou quelqu'un puissions préparer une réponse qui serve de guide sur la bibliothèque de socket à utiliser et quand, ainsi qu'une comparaison entre eux.

balupton
la source
246
Si cela se ferme, où devrait aller une question comme celle-ci? Comme la réponse sera incroyablement utile ... Semble malheureux qu'une question aussi importante ne devrait pas résider ici.
balupton
14
Woot woot pour les wikis de la communauté, ce qui signifie que malgré la fermeture de la question aux nouvelles réponses, nous pouvons toujours améliorer la réponse du wiki de la communauté ci-dessous :)
balupton
14
Je suis d'accord, j'aimerais que ce genre de question soit non seulement autorisé, mais encouragé. D'accord, ils peuvent ne pas être pertinents dans un an, mais d'ici là, ils sauveront le monde.
John Little
1
@balupton pouvez-vous mettre à jour la communauté avec votre choix et si vous en êtes satisfait? est-ce socket.io?
C graphics
3
@Cgraphics J'utilise Primus avec ws ces jours-ci, car ws est tout ce dont j'ai besoin, si j'ai besoin de quelque chose de plus extrême, j'échange simplement la bibliothèque sous-jacente et garde la même api grâce à Primus. Fonctionne à merveille.
balupton

Réponses:

390

Faire bouger les choses avec cette réponse wiki communautaire . N'hésitez pas à me modifier avec vos améliorations.

  • serveur et client ws WebSocket pour node.js. L'une des bibliothèques les plus rapides sinon la plus rapide.

  • serveur et client WebSocket -node WebSocket pour node.js

  • websocket-driver-node Serveur WebSocket et analyseur de protocole client node.js - utilisé dans faye-websocket-node

  • faye-websocket-node Serveur et client WebSocket pour node.js - utilisé dans faye et sockjs

  • socket.io Serveur WebSocket et client pour node.js + client pour les navigateurs + (v0 a les plus récentes aux plus anciennes solutions de repli, la v1 de Socket.io utilise engine.io) + canaux - utilisés dans stack.io. La bibliothèque cliente tente de se reconnecter lors de la déconnexion.

  • serveur et client sockjs WebSocket pour node.js et autres + client pour les navigateurs + solutions de remplacement les plus récentes aux plus anciennes

  • serveur et client faye WebSocket pour node.js et autres + client pour navigateurs + solutions de secours + prise en charge d'autres langues côté serveur

  • serveur en temps réel clusterable deepstream.io qui gère les connexions WebSockets et TCP et fournit la synchronisation des données, la publication / sub et la demande / réponse

  • socketcluster WebSocket cluster de serveurs qui utilise tous les cœurs de CPU de votre machine. Par exemple, si vous deviez utiliser une instance xlarge Amazon EC2 avec 32 cœurs, vous seriez en mesure de gérer près de 32 fois le trafic sur une seule instance.

  • primus Fournit une API commune à la plupart des bibliothèques ci-dessus pour faciliter la commutation et améliorer la stabilité de chacune d'entre elles.

Quand utiliser:

  • utilisez les serveurs WebSocket de base lorsque vous souhaitez utiliser les implémentations WebSocket natives côté client, attention aux incompatibilités du navigateur

  • utilisez les bibliothèques de secours lorsque vous vous souciez des solutions de rechange du navigateur

  • utilisez les bibliothèques complètes lorsque vous vous souciez des chaînes

  • utilisez primus lorsque vous ne savez pas quoi utiliser, que vous n'êtes pas d'humeur à réécrire votre application lorsque vous devez changer de cadre en raison de l'évolution des exigences du projet ou avez besoin d'une stabilité de connexion supplémentaire.

Où tester:

Firecamp est un environnement de test GUI pour SocketIO, WS et toutes les principales technologies en temps réel. Déboguez les événements en temps réel pendant que vous le développez.

balupton
la source
10
Merci pour la réponse détaillée. Pouvez-vous expliquer le point 3 de l'utilisation. Quelles sont les chaînes auxquelles le point fait référence? Je suis nouveau sur les websockets et j'essaie de comprendre lequel utiliser dans mon cas.
Akshat Jiwan Sharma
2
Et Autobahn / WAMP?
Emile Cormier
1
Belle liste de toutes les options disponibles après la mort de now.js
Rahul Prasad
@AkshatJiwanSharma: Les canaux sont les soi-disant «chambres» que chaque joueur dans une pièce peut échanger des messages ..
Marwen Trabelsi
4
Un petit détail pour ws est qu'il a besoin de python. Donc, si vous déployez sur des conteneurs Docker ou quelque chose, vous aurez besoin d'avoir python disponible pour l'utiliser ws.
AntouanK
40

Mise à jour: Cette réponse est obsolète car de nouvelles versions des bibliothèques mentionnées sont publiées depuis lors.

Socket.IO v0.9 est obsolète et un peu bogué, et Engine.IO est le successeur intérimaire. Socket.IO v1.0 (qui sortira bientôt) utilisera Engine.IO et sera bien meilleur que v0.9. Je vous recommande d'utiliser Engine.IO jusqu'à la sortie de Socket.IO v1.0.

"ws" ne prend pas en charge le remplacement, donc si le navigateur client ne prend pas en charge les websockets, cela ne fonctionnera pas, contrairement à Socket.IO et Engine.IO qui utilise l'interrogation longue, etc. si les websockets ne sont pas disponibles. Cependant, "ws" semble être la bibliothèque la plus rapide pour le moment.

Voir mon article comparant Socket.IO, Engine.IO et Primus: https://medium.com/p/b63bfca0539

Deniz Ozger
la source
Cela me rappelle que Node.js 0.12 habituel est immédiat … ils prétendent également cela depuis des mois maintenant. Donc, probablement, nous devrons attendre et voir…
Golo Roden
1
Avez-vous des idées / expériences avec Autobahn / WAMP ( wamp.ws )?
Emile Cormier
6
Socket.IO a publié sa v1. Engine.io ne le remplace pas, mais utilisé en interne par Socket.IO comme protocole de transport - il résume la communication réelle entre les points de terminaison (xhr, ws) et a un format simple pour les paquets. Socket.io fournit une API plus riche qui `` se sent '' comme un émetteur d'événements sur le fil.
hammett
29

npm ws était la réponse pour moi. Je l'ai trouvé moins intrusif et plus simple. Avec, il était également trivial de mélanger les websockets avec les services de repos. Code simple partagé sur ce post.

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
la source
Comment obtenir l'URL de demande dans le métod de connexion? wss.on ("connexion", fonction (ws) {// du code console.log (ws. ???) get url ...}
Opalosolo
il n'y a pas d'URL de requête comme dans les requêtes ajax. La bibliothèque javascript ouvre une connexion à votre serveur de socket Web en utilisant l'adresse telle que 127.0.0.1:8080 ou n'importe quoi.com:7777, etc .... Cela semble déroutant, essayez de suivre un didacticiel simple sur les sockets Web.
MFAL
5
En fait, les points de terminaison WebSocket ont également une URL, ils commencent par ws, comme ws://myserver.com. Et oui, ils peuvent également être configurés pour être servis en utilisant les ports 80 et 443. En utilisant un proxy inverse comme nginx, vous pouvez router les WebSocketURL de protocole vers un autre port à partir des protocoles HTTP normaux.
Prahlad Yeri
vous pouvez simuler des itinéraires si vous le souhaitez.
Lucas Tettamanti
1
l'utilisation express-wspermet d'ajouter des wsitinéraires dans l'application express.
Dmitry Masley