Bibliotecas WebSocket para Node.js: desde un chat simple hasta sistemas de tiempo real de alta carga
WebSocket es un protocolo que proporciona una conexión bidireccional permanente entre el cliente y el servidor. A diferencia de HTTP, donde la solicitud-respuesta la inicia el cliente, WebSocket permite al servidor enviar datos en cualquier momento. Para Node.js, conocido por su asincronía y arquitectura basada en eventos, WebSocket se ha convertido en la elección natural para crear chats, juegos en línea, terminales de trading y transmisión de datos en streaming.
En este artículo, analizaremos tres bibliotecas principales: ws (ligera y rápida), Socket.IO (conveniente con mecanismos de respaldo) y uWebSockets.js (rendimiento récord). Aprenderá cuál elegir para su tarea y cómo escribir un chat simple con cada una de ellas.
1. Biblioteca ws — minimalismo y velocidad
ws es la biblioteca WebSocket más popular para Node.js. Implementa el protocolo puro RFC 6455 sin capas adicionales. Principales ventajas:
- Máximo rendimiento: hasta más de 200 000 mensajes/segundo en un solo núcleo.
- Cero dependencias: solo JavaScript puro.
- Control total sobre la conexión: handshake, tramas, ping/pong.
- Soporte para Buffer y Streams de Node.js para datos binarios.
Desventajas: no tiene reconexión automática, no tiene salas (rooms), no tiene respaldo a HTTP long-polling. Todo debe implementarse manualmente o mediante paquetes adicionales.
Ejemplo: servidor eco simple con ws
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws) => { console.log('Cliente conectado');
ws.on('message', (message) => { console.log('Recibido:', message.toString()); // Enviar de vuelta (eco) ws.send(`Eco: ${message}`); });
ws.on('close', () => { console.log('Cliente desconectado'); });
// Enviar saludo al conectarse ws.send('¡Bienvenido al servidor WebSocket!');});
console.log('Servidor iniciado en ws://localhost:8080');¿Cuándo elegir ws? — para microservicios, juegos de alta carga (donde cada fotograma importa), para integrar en su propio servidor HTTP (a través de server.on('upgrade')).
2. Socket.IO — comodidad y fiabilidad para producción
Socket.IO no es solo WebSocket, sino una plataforma de tiempo real completa. Utiliza WebSocket como transporte principal, pero cambia automáticamente a HTTP long-polling si WebSocket no es compatible (proxies, cortafuegos, navegadores antiguos).
- Salas (Rooms) — agrupación de clientes para transmisiones broadcast.
- Espacios de nombres (Namespaces) — división lógica de la aplicación (por ejemplo, /chat y /game).
- Reconexión automática con retardo exponencial.
- Soporte de eventos — trabaja con eventos, no con mensajes sin procesar.
- Serialización integrada — transmisión de objetos JSON sin análisis manual.
Desventajas: sobrecarga del protocolo (paquetes adicionales con metadatos), más dependencias, ligeramente más lento que ws puro.
Ejemplo: chat con salas en Socket.IO (servidor)
const http = require('http');const { Server } = require('socket.io');
const server = http.createServer();const io = new Server(server, { cors: { origin: '*' } // para desarrollo});
io.on('connection', (socket) => { console.log('Nuevo cliente:', socket.id);
// Unirse a una sala socket.on('join_room', (roomName) => { socket.join(roomName); socket.emit('message', `Te has unido a la sala ${roomName}`); socket.to(roomName).emit('message', `El usuario ${socket.id} ha entrado a la sala`); });
// Enviar mensaje a la