La API WebSocket, tanto en navegadores como en servidores (con librerías como ws en Node.js), está basada en eventos. Cada conexión expone manejadores que se ejecutan automáticamente cuando ocurre una acción relevante.
Los cuatro eventos fundamentales son:
open
Cuándo se dispara: después de que el cliente completa el handshake con el servidor y el canal WebSocket queda listo.
Uso típico: enviar el primer mensaje, mostrar estado de conexión, habilitar botones de UI.
Cliente (JavaScript en navegador)
const ws = new WebSocket("ws://localhost:8080");
ws.onopen = () => {
console.log("✅ Conexión abierta con el servidor");
ws.send("Hola servidor, ya estoy conectado!");
};
message
Cuándo se dispara: cada vez que llega un frame de datos (texto o binario).
Uso típico: procesar mensajes JSON, mostrar mensajes en un chat, actualizar la UI.
Cliente
ws.onmessage = (event) => {
console.log("📩 Mensaje recibido:", event.data);
// Si el servidor envía JSON:
try {
const data = JSON.parse(event.data);
console.log("Tipo:", data.type, "Payload:", data.payload);
} catch {
console.log("Texto plano:", event.data);
}
};
Servidor (Node.js con ws)
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });
wss.on("connection", (ws) => {
ws.on("message", (msg) => {
console.log("📩 Cliente dice:", msg.toString());
ws.send("Recibido: " + msg);
});
});
close
Cuándo se dispara: cuando el cliente o el servidor cierra la conexión.
Uso típico: liberar recursos, mostrar mensajes de desconectado, intentar reconectar.
Cliente
ws.onclose = (event) => {
console.log("👋 Conexión cerrada");
console.log("Código de cierre:", event.code, "Razón:", event.reason);
// Ejemplo de reconexión automática
setTimeout(() => {
console.log("Reintentando conexión...");
connect(); // función que vuelve a crear un WebSocket
}, 2000);
};
Ejemplos de códigos de cierre comunes
1000
: cierre normal.1001
: usuario abandonó.1006
: cierre anómalo (sin handshake de cierre).1011
: error en el servidor.error
Cuándo se dispara: si ocurre un error de red o de protocolo.
Importante: el evento error
no cierra automáticamente la conexión, pero suele ir seguido de un close
.
Cliente
ws.onerror = (err) => {
console.error("❌ Error en WebSocket:", err);
};
Servidor
wss.on("connection", (ws) => {
ws.on("error", (err) => {
console.error("❌ Error en cliente:", err.message);
});
});
Cliente (Browser) Servidor (Node.js)
onopen -------------------> conexión establecida
onmessage <------------------- ws.send("Hola cliente")
ws.send("Hola servidor") ----> on("message", ...)
onclose <------------------- cierre de conexión
onerror <------------------- error de red/protocolo
<!doctype html>
<html lang="es">
<body>
<script>
let ws = new WebSocket("ws://localhost:8080");
ws.onopen = () => {
console.log("✅ Conexión abierta");
ws.send("Hola servidor!");
};
ws.onmessage = (e) => {
console.log("📩 Servidor dice:", e.data);
};
ws.onclose = (e) => {
console.log("👋 Conexión cerrada (code:", e.code, "reason:", e.reason, ")");
};
ws.onerror = (err) => {
console.error("❌ Error en WS:", err);
};
</script>
</body>
</html>