mkdir websockets-js && cd websockets-js
npm init -y
npm i ws
// server-ws.js
const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8080 }, () => {
console.log("Servidor WS en ws://localhost:8080");
});
wss.on("connection", (ws) => {
console.log("Cliente conectado");
ws.send("Bienvenido! Conexión WebSocket establecida.");
ws.on("message", (msg) => {
console.log("Mensaje del cliente:", msg.toString());
// Eco al mismo cliente
ws.send("Eco: " + msg.toString());
// Broadcast a todos los conectados (ejemplo):
// wss.clients.forEach(c => c.readyState === WebSocket.OPEN && c.send("[Broadcast] " + msg));
});
ws.on("close", () => console.log("Cliente desconectado"));
});
node server-ws.js
Ábrelo con doble clic en el navegador.
<!doctype html>
<html lang="es">
<body>
<script>
const ws = new WebSocket("ws://localhost:8080");
ws.onopen = () => {
console.log("Abierto");
ws.send("Hola servidor (WS puro)!");
};
ws.onmessage = (e) => console.log("Servidor:", e.data);
ws.onclose = () => console.log("Cerrado");
ws.onerror = (err) => console.error("Error WS:", err);
</script>
</body>
</html>
¿Por qué usarlo? Maneja reconexión automática, salas/canales, fallback y una API muy cómoda.
npm i socket.io
// server-sio.js
const { Server } = require("socket.io");
// Habilita CORS para pruebas locales (orígenes cualquiera)
const io = new Server(3000, { cors: { origin: "*" } });
io.on("connection", (socket) => {
console.log("Cliente conectado:", socket.id);
socket.emit("saludo", "Bienvenido a Socket.IO!");
socket.on("mensaje", (payload) => {
console.log("mensaje:", payload);
// Responder solo a este socket:
socket.emit("eco", payload);
// O broadcast a todos:
// io.emit("broadcast", payload);
});
socket.on("disconnect", () => console.log("Cliente desconectado:", socket.id));
});
console.log("Socket.IO en ws://localhost:3000 (handshake HTTP + WS bajo el capó)");
<!doctype html>
<html lang="es">
<body>
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
<script>
const socket = io("http://localhost:3000");
socket.on("connect", () => console.log("Conectado", socket.id));
socket.on("saludo", (m) => console.log("Servidor:", m));
socket.on("eco", (m) => console.log("Eco:", m));
socket.on("broadcast",(m) => console.log("Broadcast:", m));
socket.on("disconnect", () => console.log("Desconectado"));
// Enviar un mensaje de prueba
socket.emit("mensaje", "Hola servidor (Socket.IO)!");
</script>
</body>
</html>
Más info: Socket.IO.
cliente-ws.html
verás los frames).onopen
/onmessage
.ws://localhost:8080
(ws puro) o a la URL de Socket.IO.Si prefieres abrir el HTML desde un servidor HTTP:
npm i express
http-static.js
:
const express = require("express");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname, "public"))); // coloca tus HTML/JS/CSS en /public
app.listen(8081, () => console.log("HTTP estático en http://localhost:8081"));
Estructura:
websockets-js/
public/
cliente-ws.html
cliente-sio.html
server-ws.js
server-sio.js
http-static.js
Ejecuta node http-static.js
y abre http://localhost:8081/cliente-ws.html
.
Para producción siempre WSS. En local puedes crear un certificado de desarrollo.
mkcert -install
mkcert localhost
Genera localhost.pem
y localhost-key.pem
.
const fs = require("fs");
const https = require("https");
const WebSocket = require("ws");
const server = https.createServer({
cert: fs.readFileSync("./localhost.pem"),
key: fs.readFileSync("./localhost-key.pem"),
});
const wss = new WebSocket.Server({ server });
wss.on("connection", (ws) => {
ws.send("Conexión WSS segura!");
ws.on("message", (m) => ws.send("Eco (WSS): " + m));
});
server.listen(8443, () => console.log("WSS en wss://localhost:8443"));
<script>
const ws = new WebSocket("wss://localhost:8443");
ws.onopen = () => ws.send("Hola por WSS");
ws.onmessage = (e) => console.log(e.data);
</script>
Si el navegador advierte del certificado, confía en el certificado local creado por mkcert.
npm i dotenv
server-ws-env.js
:
require("dotenv").config();
const WebSocket = require("ws");
const PORT = process.env.PORT || 8080;
const wss = new WebSocket.Server({ port: PORT }, () => {
console.log(`WS en ws://localhost:${PORT}`);
});
.env
:
PORT=8082
{
"scripts": {
"ws": "node server-ws.js",
"sio": "node server-sio.js",
"wss": "node secure-ws.js",
"static": "node http-static.js"
}
}
Ejecuta:
npm run ws
npm run sio
npm run wss
npm run static
{type, payload}
) para eventos.onerror
, try/catch y logs claros en servidor y cliente.cors: { origin: "http://localhost:8081" }
si sirves el front aparte.ws://
?ws://host:puerto
o wss://
.cert/key
y confianza del navegador.