Qué son los WebSockets?

Definición

Los WebSockets son un protocolo de comunicación que permite abrir un canal persistente, bidireccional y full‑dúplex entre un cliente (por ejemplo, un navegador) y un servidor.

En palabras simples:

  • Con HTTP tradicional, el cliente debe preguntar al servidor (hacer una petición) para recibir datos.
  • Con WebSockets, cliente y servidor pueden enviarse mensajes en cualquier momento, sin abrir y cerrar conexiones continuamente.

Esto habilita comunicación en tiempo real, esencial en aplicaciones modernas como chats, juegos en línea, notificaciones instantáneas, plataformas de trading o monitoreo en vivo.

Características principales

  • Bidireccionalidad: ambas partes pueden enviar datos sin esperar a que la otra inicie el intercambio.
  • Conexión persistente: se establece una sola vez y se mantiene abierta hasta que alguna de las partes la cierre.
  • Bajo consumo de recursos: a diferencia del long polling, evita abrir múltiples conexiones y reenviar encabezados en cada petición.
  • Estándar oficial: definido en el RFC 6455 (2011), con soporte amplio en navegadores y servidores.
  • Soporte de datos flexible: permite enviar texto, binarios, JSON o mensajes codificados según la necesidad.

Diferencia con HTTP tradicional

Aspecto HTTP (request‑response) WebSockets (tiempo real)
Conexión Se abre y se cierra en cada petición Se abre una vez y permanece activa
Comunicación Solo el cliente inicia la interacción Cliente y servidor envían mensajes libremente
Eficiencia Más overhead (encabezados en cada request) Liviano: solo se transmite el mensaje
Latencia Alta (depende de peticiones periódicas) Baja (casi instantánea)
Casos típicos Cargar páginas, APIs REST Chats, juegos, trading, colaboración en tiempo real

Ejemplo básico (cliente - navegador)

// Crear una conexión WebSocket
const socket = new WebSocket("ws://localhost:8080");

// Evento cuando se abre la conexión
socket.onopen = () => {
  console.log("Conexión establecida con el servidor");
  socket.send("Hola servidor, soy el cliente!");
};

// Evento cuando llega un mensaje del servidor
socket.onmessage = (event) => {
  console.log("Mensaje recibido:", event.data);
};

// Evento cuando se cierra la conexión
socket.onclose = () => {
  console.log("Conexión cerrada");
};

// Manejo de errores (opcional)
socket.onerror = (err) => {
  console.error("Error en WebSocket:", err);
};

Ejemplo básico (servidor - Node.js con ws)

// Instalar la librería una vez: npm install ws
const WebSocket = require("ws");

// Crear servidor WebSocket en el puerto 8080
const wss = new WebSocket.Server({ port: 8080 });

wss.on("connection", (ws) => {
  console.log("Cliente conectado");

  // Enviar mensaje al cliente
  ws.send("Bienvenido al servidor WebSocket!");

  // Recibir mensajes del cliente
  ws.on("message", (message) => {
    console.log("Mensaje del cliente:", message);
    ws.send("Recibí tu mensaje: " + message);
  });

  // Detectar cierre
  ws.on("close", () => {
    console.log("Cliente desconectado");
  });
});

Para el ejemplo del servidor se utiliza Node.js y la librería ws.

Diagrama básico WebSocket cliente-servidor

Casos de uso donde WebSockets brillan

  • Aplicaciones de mensajería: WhatsApp Web, Slack, Messenger.
  • Notificaciones en vivo: correos, alertas de seguridad, novedades en apps.
  • Juegos en tiempo real: multijugador online.
  • Streaming de datos financieros: criptomonedas, bolsa de valores.
  • IoT y sensores: envío de datos en vivo desde dispositivos conectados.
  • Apps colaborativas: edición compartida de documentos, pizarras en línea.

En resumen

Los WebSockets permiten aplicaciones web interactivas y en tiempo real, superando las limitaciones del modelo de petición/respuesta de HTTP y reduciendo latencia y uso de recursos.