Definición
WebSocket es un protocolo de comunicación que permite conexión bidireccional persistente entre cliente y servidor sobre una única conexión TCP. A diferencia de HTTP — que es petición-respuesta y sin estado — WebSocket mantiene la conexión abierta y ambos lados pueden enviar mensajes en cualquier momento sin que el otro haya pedido nada.
Se estandarizó en 2011 (RFC 6455) y hoy es la base de cualquier aplicación que necesite datos en tiempo real: chats, notificaciones push, colaboración multi-usuario (Google Docs, Figma), cotizaciones bursátiles, multijugador online, marcadores deportivos, IoT.
A nivel de URL se reconoce por el protocolo: en lugar de https:// usa wss:// (WebSocket Secure) o ws:// (sin cifrar — solo para desarrollo).
Cómo funciona
El flujo típico:
- Handshake HTTP: el cliente envía una petición HTTP especial con headers
Upgrade: websocket - Servidor acepta el upgrade: responde con
101 Switching Protocols - Conexión TCP queda abierta: ya no es HTTP, es WebSocket puro
- Mensajes bidireccionales: ambos lados envían frames cuando quieren
- Conexión se cierra cuando alguna parte lo decide o hay error de red
Los frames son ligeros: 2-14 bytes de cabecera + payload. Mucho menos overhead que abrir una nueva petición HTTP cada vez.
Ejemplo práctico
Cliente JavaScript que recibe notificaciones de nuevos pedidos en IMDICA en tiempo real:
// 1. Abrir conexión
const ws = new WebSocket('wss://api.imdica.es/eventos');
// 2. Esperar a que abra
ws.onopen = () => {
console.log('Conectado al feed de eventos');
// Suscribirse a un canal específico
ws.send(JSON.stringify({ action: 'subscribe', channel: 'pedidos-nuevos' }));
};
// 3. Recibir mensajes en tiempo real
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.tipo === 'pedido_nuevo') {
mostrarNotificacion(`Nuevo pedido: ${data.cliente} - ${data.total}€`);
}
};
// 4. Cerrar cuando ya no se necesita
window.addEventListener('beforeunload', () => ws.close());
El servidor (Node.js con la librería ws):
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
// Cuando llega un pedido nuevo a la BD, notificar a todos
eventos.on('pedidoNuevo', (pedido) => {
ws.send(JSON.stringify({
tipo: 'pedido_nuevo',
cliente: pedido.cliente,
total: pedido.total
}));
});
});
WebSocket vs HTTP polling
Antes de WebSocket, "tiempo real" se simulaba con polling: el cliente pregunta cada X segundos "¿hay novedades?". Comparativa:
| HTTP Polling | WebSocket | |
|---|---|---|
| Latencia | Hasta X seg (intervalo) | Instantánea |
| Overhead | Alto (1 petición HTTP cada poll) | Mínimo (1 conexión, frames ligeros) |
| Servidor | Más carga | Menos carga |
| Push real desde servidor | No | Sí |
| Complejidad | Baja | Media |
Para apps modernas con +1.000 usuarios concurrentes, WebSocket es mucho más eficiente.
Alternativas a considerar
- Server-Sent Events (SSE): solo unidireccional (servidor → cliente). Más simple. Si no necesitas que el cliente mande mensajes constantes, suele bastar.
- HTTP/2 server push: caído en desuso. Está siendo retirado.
- WebRTC: comunicación peer-to-peer (cliente ↔ cliente), no cliente-servidor.
- Long polling: HTTP normal pero el servidor mantiene la respuesta hasta que tiene algo que decir. Cada vez menos usado.
Errores comunes
- No manejar reconexión: las conexiones WebSocket se cortan por timeout, cambios de red, suspensión móvil. Tu cliente debe reconectar automáticamente con backoff exponencial.
- No autenticar: WebSocket no tiene autenticación built-in. Pasa el token en el handshake (en cookie, query param o header personalizado) y validalo en el servidor antes de aceptar.
- Enviar mensajes muy grandes: WebSocket está pensado para mensajes pequeños y frecuentes. Si tienes que enviar 5MB, usa HTTP o sube a S3 y manda solo la URL por WS.
- No definir un protocolo de mensajes: ¿qué tipo de mensaje es? ¿qué campos lleva? Si no defines un schema, debugging se vuelve infierno. Usa JSON con un campo
tipoo algo similar. - Escalar a múltiples servidores sin pensar: si tu app corre en 3 servidores y la conexión va a uno, los eventos generados en otros no llegan. Necesitas pub/sub (Redis, Kafka) para sincronizar.
Cuándo usar WebSocket
Sí cuando:
- Chats o mensajería en tiempo real
- Notificaciones push instantáneas
- Edición colaborativa multi-usuario
- Cotizaciones, marcadores, tickers
- Multijugador online
- Dashboards live con métricas
No cuando:
- Solo necesitas refresh de datos cada cierto tiempo (basta polling razonable o SSE)
- Tu hosting compartido no soporta conexiones persistentes (mucho hosting tradicional no)
- Tu carga es baja y el coste operativo de WebSocket no compensa
Referencias
- MDN — WebSocket API
- RFC 6455 — WebSocket Protocol
- Socket.IO — librería popular que añade reconexión, fallbacks y rooms sobre WebSocket