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
- Chat y mensajería instantánea.
- Notificaciones push en la propia app.
- Dashboards en vivo (cotizaciones, métricas, marcadores).
- Colaboración en tiempo real (editar un documento entre varios).