WebSockets

Un protocolo que mantiene una conexión abierta entre el cliente y el servidor para comunicación bidireccional en tiempo real

Los WebSockets son un protocolo de comunicación que permite mantener una conexión abierta y permanente entre el navegador y el servidor. A diferencia de HTTP, donde el cliente hace un pedido y el servidor responde (y ahí se cierra la conversación), con WebSockets la conexión queda abierta y ambos lados pueden enviarse mensajes en cualquier momento.

El problema con HTTP

Con el modelo clásico de request-response de HTTP, el servidor no puede mandarte datos si vos no los pediste primero. Pensalo así: es como mandar cartas por correo. Vos mandás una carta (request), esperás la respuesta (response), y si querés saber si hay novedades, tenés que mandar otra carta.

Para una app de chat, eso sería terrible. Tendrías que preguntar cada segundo: "¿Hay mensajes nuevos?" "¿Y ahora?" "¿Y ahora?". Esto se llama polling y es muy ineficiente.

Polling (HTTP):
Client: Any new messages?  → Server: No
Client: Any new messages?  → Server: No
Client: Any new messages?  → Server: Yes, here you go!
Client: Any new messages?  → Server: No
// Tons of unnecessary requests

Cómo funcionan los WebSockets

Con WebSockets, el cliente y el servidor hacen un "apretón de manos" (handshake) inicial usando HTTP, y después la conexión se upgradea a WebSocket. A partir de ahí, la conexión queda abierta y cualquiera de los dos puede enviar mensajes cuando quiera.

WebSocket:
Client ←──open connection──→ Server
   │                              │
   │  "Hi, how are you?"    ───→  │
   │                              │
   │ ←── "Great! New message"     │
   │ ←── "Ana connected"          │
   │                              │
   │  "Typing..."            ───→ │
   │                              │
// The connection remains open

Ejemplo con Socket.IO

Socket.IO es la librería más popular para trabajar con WebSockets en JavaScript. Simplifica mucho el manejo de la conexión y agrega funcionalidades como reconexión automática y salas (rooms).

// Server (Node.js) import { Server } from 'socket.io'; const io = new Server(3000); io.on('connection', (socket) => { console.log('User connected:', socket.id); // Listen for an event from the client socket.on('new-message', (data) => { // Forward the message to all other users socket.broadcast.emit('new-message', data); }); socket.on('disconnect', () => { console.log('User disconnected:', socket.id); }); });
// Client (browser) import { io } from 'socket.io-client'; const socket = io('http://localhost:3000'); // Send a message socket.emit('new-message', { text: 'Hello everyone!', user: 'Carlos' }); // Listen for messages from others socket.on('new-message', (data) => { displayMessage(data.text, data.user); });

Casos de uso

Los WebSockets son ideales para cualquier funcionalidad donde necesitás actualizaciones instantáneas:

  • Chat en tiempo real: mensajes que aparecen al instante
  • Colaboración en vivo: como Google Docs, donde varios usuarios editan al mismo tiempo
  • Dashboards en vivo: métricas y gráficos que se actualizan al instante
  • Juegos multijugador: sincronizar las acciones de todos los jugadores
  • Notificaciones push: avisar al usuario de algo sin que refresque la página

No todo necesita WebSockets. Si los datos cambian cada varios minutos o el usuario puede refrescar la página, una API HTTP clásica alcanza y sobra. Usá WebSockets cuando la latencia importa y necesitás actualizaciones instantáneas. Para enviar datos en una sola dirección (del servidor al cliente), también podés considerar streaming con Server-Sent Events, que es más simple.