CONCEPTOS BASE

WebSocket

Protocolo de comunicación bidireccional en tiempo real entre cliente y servidor a través de una única conexión persistente. La base de chats, notificaciones live y colaboración en tiempo real.

Nivel · intermedio4 min de lecturaActualizado 22 may 2026
También conocido como: WS, Web Socket

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:

  1. Handshake HTTP: el cliente envía una petición HTTP especial con headers Upgrade: websocket
  2. Servidor acepta el upgrade: responde con 101 Switching Protocols
  3. Conexión TCP queda abierta: ya no es HTTP, es WebSocket puro
  4. Mensajes bidireccionales: ambos lados envían frames cuando quieren
  5. 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 PollingWebSocket
LatenciaHasta X seg (intervalo)Instantánea
OverheadAlto (1 petición HTTP cada poll)Mínimo (1 conexión, frames ligeros)
ServidorMás cargaMenos carga
Push real desde servidorNo
ComplejidadBajaMedia

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 tipo o 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

Tagsredprotocolotiempo-realbackend