¿Qué biblioteca websocket usar con Node.js? [cerrado]

429

Actualmente hay una gran cantidad de bibliotecas websocket para node.js, las más populares parecen ser:

Sin embargo, no puedo encontrar comparaciones concretas sólidas entre ninguno de ellos ... Al parecer, Socket.io fue increíble, pero se ha vuelto bastante anticuado y tiene construcciones defectuosas. Tanto ws como websocket-node afirman que son los más rápidos. Y engine.io parece nuevo, pero mucho más pesado que las alertas más ligeras.

Sería sorprendente si nosotros o alguien pudiéramos armar una respuesta que sirva como guía sobre qué biblioteca de socket usar y cuándo, así como una comparación entre ellos.

Balupton
fuente
246
Si esto se cierra, ¿a dónde debería ir una pregunta como esta? Como la respuesta será increíblemente útil ... Parece lamentable que una pregunta tan prominente no resida aquí.
Balupton
14
Woot woot para la comunidad de wikis, lo que significa que a pesar de la pregunta que se cerró de nuevas respuestas, todavía podemos mejorar la respuesta de la comunidad wiki continuación :)
balupton
14
Estoy de acuerdo, me gustaría ver este tipo de preguntas no solo permitidas, sino alentadas. OK, pueden no ser relevantes en años, pero hasta entonces salvarán el mundo.
John Little
1
@balupton, ¿puedes actualizar la comunidad con tu elección y si estás contento con ella? es socket.io?
Gráficos C el
3
@Cgraphics Utilizo Primus con ws en estos días, ya que ws es todo lo que necesitaba, si necesito algo más extremo, simplemente cambio la biblioteca subyacente y mantengo la misma API gracias a Primus. Funciona de maravillas.
Balupton

Respuestas:

390

Hacer que la pelota ruede con esta respuesta wiki de la comunidad . Siéntase libre de editarme con sus mejoras.

  • ws Servidor y cliente WebSocket para node.js. Una de las bibliotecas más rápidas, si no la más rápida.

  • websocket-node Servidor y cliente WebSocket para node.js

  • websocket-driver-node Servidor WebSocket y analizador de protocolo de cliente node.js - utilizado en faye-websocket-node

  • faye-websocket-node Servidor y cliente WebSocket para node.js - utilizado en faye y sockjs

  • servidor y cliente de socket.io WebSocket para node.js + cliente para navegadores + (v0 tiene fallos más nuevos a más antiguos, v1 de Socket.io usa engine.io) + canales - utilizados en stack.io. La biblioteca del cliente intenta volver a conectarse tras la desconexión.

  • Servidor y cliente de sockjs WebSocket para node.js y otros + cliente para navegadores + fallos más nuevos a más antiguos

  • servidor y cliente de faye WebSocket para node.js y otros + cliente para navegadores + fallbacks + soporte para otros idiomas del lado del servidor

  • Deepstream.io servidor en tiempo real en clúster que maneja conexiones WebSockets y TCP y proporciona sincronización de datos, pub / sub y solicitud / respuesta

  • socketcluster Clúster de servidor WebSocket que utiliza todos los núcleos de CPU en su máquina. Por ejemplo, si usara una instancia xlarge de Amazon EC2 con 32 núcleos, podría manejar casi 32 veces el tráfico en una sola instancia.

  • primus Proporciona una API común para la mayoría de las bibliotecas anteriores para facilitar el cambio + mejoras de estabilidad para todas ellas.

Cuándo usar:

  • use los servidores básicos de WebSocket cuando quiera usar las implementaciones nativas de WebSocket en el lado del cliente, tenga cuidado con las incompatibilidades del navegador

  • use las bibliotecas de reserva cuando le interesen las fallas del navegador

  • usa las bibliotecas con todas las funciones cuando te interesan los canales

  • use primus cuando no tenga idea de qué usar, no esté de humor para reescribir su aplicación cuando necesite cambiar marcos debido a los requisitos cambiantes del proyecto o necesite estabilidad de conexión adicional.

Dónde probar

Firecamp es un entorno de prueba de GUI para SocketIO, WS y todas las principales tecnologías en tiempo real. Depure los eventos en tiempo real mientras lo desarrolla.

balupton
fuente
10
Gracias por la respuesta detallada. ¿Puede explicar el punto 3 sobre cuándo usarlo? ¿A qué canales se refiere el punto? Soy nuevo en websockets y estoy tratando de entender cuál usar en mi caso.
Akshat Jiwan Sharma
2
¿Qué pasa con Autobahn / WAMP?
Emile Cormier
1
Buena lista de todas las opciones disponibles después de la muerte de now.js
Rahul Prasad
@AkshatJiwanSharma: Channels es la llamada 'sala' que cada jugador en una sala puede intercambiar mensajes ...
Marwen Trabelsi
44
Un pequeño detalle para ws es que necesita python. Por lo tanto, si implementa en contenedores Docker o algo así, necesitará tener Python disponible para usar ws.
AntouanK
40

Actualización: esta respuesta está desactualizada ya que las versiones más nuevas de las bibliotecas mencionadas se lanzan desde entonces.

Socket.IO v0.9 está desactualizado y tiene errores, y Engine.IO es el sucesor provisional. Socket.IO v1.0 (que se lanzará pronto) usará Engine.IO y será mucho mejor que v0.9. Le recomiendo que use Engine.IO hasta que se publique Socket.IO v1.0.

"ws" no admite respaldo, por lo que si el navegador del cliente no admite websockets, no funcionará, a diferencia de Socket.IO y Engine.IO, que utiliza sondeos largos, etc., si los websockets no están disponibles. Sin embargo, "ws" parece ser la biblioteca más rápida en este momento.

Vea mi artículo comparando Socket.IO, Engine.IO y Primus: https://medium.com/p/b63bfca0539

Deniz Ozger
fuente
Esto me recuerda que el Node.js 0.12 habitual es inmediato ... también afirman que desde hace meses. Entonces, probablemente, tendremos que esperar y ver ...
Golo Roden
1
¿Tiene alguna idea / experiencia con Autobahn / WAMP ( wamp.ws )?
Emile Cormier
66
Socket.IO lanzó su v1. Engine.io no lo reemplaza, pero lo utiliza internamente Socket.IO como protocolo de transporte: abstrae la comunicación real entre puntos finales (xhr, ws) y tiene un formato simple para paquetes. Socket.io proporciona una API más rica que 'se siente' como un emisor de eventos a través del cable.
hammett
29

npm ws fue la respuesta para mí. Lo encontré menos intrusivo y más directo. Con esto también era trivial mezclar websockets con servicios de descanso. Código simple compartido en esta publicación.

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
fuente
¿Cómo obtener la url de solicitud en el método de conexión? wss.on ("conexión", función (ws) {// algún código console.log (ws. ???) get url ...}
Opalosolo
no hay url de solicitud como en las solicitudes ajax. La biblioteca javascript abre una conexión a su servidor de socket web utilizando una dirección como 127.0.0.1:8080 o cualquier cosa.com:7777, etc. Suena confuso, intente seguir un tutorial simple sobre sockets web.
MFAL
55
En realidad, los puntos finales de WebSocket también tienen url, comienzan con ws, como ws://myserver.com. Y sí, también se pueden configurar para que se sirvan utilizando 80 y 443 puertos. Usando un proxy inverso como nginx, puede enrutar las WebSocketURL del protocolo a otro puerto desde los protocolos HTTP normales.
Prahlad Yeri
puedes simular rutas si lo deseas.
Lucas Tettamanti
1
El uso express-wspermite agregar wsrutas en la aplicación express.
Dmitry Masley