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
Escrito por
Antonio Echeverría

Dirijo IMDICA, una empresa de suministro industrial, desde 2007. Escribo estas definiciones desde el lado de quien las usa para decidir, no desde el de quien las estudia.

Si necesitas que alguien construya esto de verdad y no solo lo explique, eso es lo que hago en AE Works.