TechLead
Principiante
25 min
Guía completa

Fundamentos de WebSocket

Aprende cómo funciona el protocolo WebSocket, su ciclo de vida y cuándo usarlo

¿Qué es WebSocket?

WebSocket es un protocolo de comunicación que ofrece un canal persistente y bidireccional sobre una única conexión TCP. A diferencia de HTTP, cliente y servidor pueden enviar mensajes en cualquier momento.

Es la base de chats, juegos, paneles en vivo y herramientas colaborativas modernas.

🔄 HTTP vs WebSocket

HTTP (Request‑Response)

Client: GET /api/messages
Server: 200 OK [messages]
        (connection closed)

Client: POST /api/message
Server: 201 Created
        (connection closed)

WebSocket (Persistente)

Client: Upgrade to WebSocket
Server: 101 Switching Protocols
        (connection stays open)

Client: {"type": "message"}
Server: {"type": "message"}

Handshake y upgrade HTTP

La conexión comienza con una petición HTTP que se “actualiza” a WebSocket. Esto permite atravesar proxies y balanceadores antes de cambiar de protocolo.

// Client sends HTTP upgrade request:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

// Server responds with 101 Switching Protocols:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Ciclo de vida básico

const socket = new WebSocket('wss://api.example.com/ws');

socket.onopen = () => {
  socket.send(JSON.stringify({ type: 'hello' }));
};

socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Mensaje:', data);
};

socket.onerror = (err) => console.error(err);
socket.onclose = () => console.log('Cerrado');

Enviar datos

// Texto
socket.send('hola');
socket.send(JSON.stringify({ type: 'message', text: 'Hola' }));

// Binario
const buffer = new Uint8Array([1, 2, 3]);
socket.send(buffer);

⚠️ Seguridad

  • ✗ Usa siempre WSS en producción
  • ✗ Valida autenticación y autorización en cada mensaje
  • ✗ Limita tamaño y frecuencia de mensajes
  • ✗ Valida el Origin para evitar hijacking

💡 Resumen

  • ✓ Conexión persistente y bidireccional
  • ✓ Menos overhead que HTTP por mensaje
  • ✓ Soporta texto y binario
  • ✓ Ideal para apps con alta frecuencia de eventos