Una conexión WebSocket no es simplemente abrir y cerrar. El protocolo define un ciclo de vida con distintos estados, eventos asociados y mensajes de control que garantizan un intercambio ordenado.
Este ciclo puede dividirse en cuatro etapas principales:
En JavaScript, un objeto WebSocket puede estar en uno de los siguientes estados (ws.readyState
):
Estos valores son constantes accesibles como WebSocket.CONNECTING
, WebSocket.OPEN
, etc.
Upgrade: websocket
.101 Switching Protocols
.onopen
(conexión lista) y onmessage
(recepción de mensajes).onerror
.0x8
), que puede incluir un código de estado y un mensaje opcional.onclose
. +---------------------+
| CONNECTING (0) |
+----------+----------+
|
v
+---------------------+
| OPEN (1) |
| (mensajes libres) |
+----------+----------+
|
v
+---------------------+
| CLOSING (2) |
| (frames de cierre) |
+----------+----------+
|
v
+---------------------+
| CLOSED (3) |
+---------------------+
const ws = new WebSocket("ws://localhost:8080");
// Estado inicial
console.log("Estado inicial:", ws.readyState); // 0 (CONNECTING)
ws.onopen = () => {
console.log("Conexión abierta");
console.log("Estado:", ws.readyState); // 1 (OPEN)
ws.send("¡Hola servidor!");
};
ws.onmessage = (event) => {
console.log("Mensaje recibido:", event.data);
};
ws.onerror = (error) => {
console.error("Error en WS:", error);
};
ws.onclose = (event) => {
console.log("Conexión cerrada");
console.log("Código:", event.code, "Razón:", event.reason);
};
Si cerrás el servidor o el cliente, se disparará el evento onclose
.
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 });
wss.on("connection", (ws) => {
console.log("Cliente conectado");
ws.send("¡Bienvenido!");
// Cerrar después de 5 segundos
setTimeout(() => {
ws.close(1000, "Fin de la sesión");
// 1000 = código de cierre normal
}, 5000);
});
En el cliente, onclose
recibirá code: 1000 y reason: "Fin de la sesión".
El ciclo de vida de una conexión WebSocket pasa por CONNECTING → OPEN → CLOSING → CLOSED, con eventos bien definidos (onopen
, onmessage
, onerror
, onclose
). Gracias a este modelo, el protocolo maneja mensajes en tiempo real de forma ordenada y confiable.