DevPath · Aprende a programar ESPTEN

Tiempo real, GraphQL y mensajería

Tiempo real con WebSockets

El límite de HTTP

HTTP es petición-respuesta: el cliente pregunta y el servidor contesta. El servidor no puede hablar primero. Para un chat o un panel en vivo eso es un problema: ¿cómo le avisa el servidor al navegador de que ha llegado un mensaje nuevo?

La solución clásica es el polling: el cliente pregunta cada pocos segundos "¿hay algo nuevo?". Funciona, pero desperdicia peticiones (casi siempre la respuesta es "no") y añade latencia (hasta varios segundos de retraso).

WebSockets

Un WebSocket abre una conexión persistente y bidireccional entre cliente y servidor sobre una sola conexión TCP. Una vez abierta, ambos lados pueden enviar datos en cualquier momento, sin volver a pedir permiso.

// En el navegador
const socket = io();                 // abre la conexión
socket.on("mensaje", (m) => {        // escucha eventos del servidor
  console.log("Llegó:", m);
});
socket.emit("enviar", "Hola");       // emite un evento al servidor

Socket.io es la librería más usada en Node para esto. Su modelo es de eventos con nombre: emit("nombre", datos) envía y on("nombre", cb) escucha. Es el mismo patrón publicador/suscriptor que ya conoces de los EventEmitter de Node.

// En el servidor
io.on("connection", (socket) => {
  socket.on("enviar", (texto) => {
    io.emit("mensaje", texto);       // reenvía a todos los conectados
  });
});

Salas (rooms)

Una sala agrupa conexiones para emitir solo a un subconjunto. Útil para canales de chat, partidas o un usuario concreto:

socket.join("sala-42");                  // el socket entra en la sala
io.to("sala-42").emit("mensaje", texto); // solo los de esa sala lo reciben

Casos de uso

Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
GraphQL: un esquema, un endpoint →