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