¿Por qué JavaScript en la programación de redes?
Hubo un tiempo en que JavaScript era solo un lenguaje para animar botones y validar formularios. Hoy es una herramienta potentísima para crear aplicaciones de red. La programación de redes en JavaScript abre las puertas al mundo del tiempo real: chats, juegos en línea, transmisión de datos, sistemas de monitoreo e incluso tus propios servidores web.
En este artículo no vamos a copiar aburridamente la documentación. Recorreremos el camino desde una simple petición HTTP hasta una conexión WebSocket completa. Verás cómo Node.js transforma un lenguaje de navegador en un potente motor de red. ¿Listos? ¡Allá vamos!
Fundamentos: HTTP y módulos de Node.js
Cualquier programación de redes en JavaScript comienza con la comprensión de los protocolos. El más popular es HTTP. En el navegador usas fetch() o XMLHttpRequest, pero la parte del servidor requiere un enfoque diferente.
Creando un servidor HTTP simple
Node.js proporciona el módulo incorporado http. Aquí tienes un ejemplo mínimo que responde "¡Hola, mundo!" a cualquier petición:
const http = require('http');
const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('¡Hola, mundo! ¡La programación de redes en JavaScript funciona!');});
server.listen(3000, '127.0.0.1', () => { console.log('Servidor iniciado en http://127.0.0.1:3000/');});Ejecuta este código con node server.js y abre el navegador. Verás nuestro mensaje. Sencillo, ¿verdad? Pero esto es solo el comienzo. La magia real empieza cuando trabajamos con sockets.
Trabajo con sockets TCP en JavaScript
HTTP es un protocolo de nivel de aplicación construido sobre TCP. Si necesitas control total sobre la transmisión de datos, usa sockets JavaScript. En Node.js, el módulo net se encarga de esto.
Servidor TCP: recibiendo datos
Imagina que escribes un simple servidor eco. El cliente se conecta, envía un mensaje y el servidor lo devuelve. Así es como se ve:
const net = require('net');
const server = net.createServer((socket) => { console.log('Cliente conectado');
socket.on('data', (data) => { console.log('Recibido:', data.toString()); socket.write('Eco: ' + data.toString()); });
socket.on('end', () => { console.log('Cliente desconectado'); });});
server.listen(8080, () => { console.log('Servidor TCP escuchando en el puerto 8080');});Ahora escribamos un cliente para este servidor. Cliente-servidor en JavaScript es un movimiento bidireccional:
const net = require('net');
const client = net.createConnection({ port: 8080 }, () => { console.log('Conectado al servidor'); client.write('¡Hola, servidor!');});
client.on('data', (data) => { console.log('Respuesta del servidor:', data.toString()); client.end();});
client.on('end', () => { console.log('Desconectado del servidor');});Ejecuta primero el servidor, luego el cliente. Verás cómo los datos viajan de un lado a otro. Esta es la base de todos los protocolos de red en JavaScript.
WebSocket: tiempo real sin demoras
HTTP y TCP son buenos, pero tienen un problema: para obtener nuevos datos, el cliente debe hacer peticiones constantemente (polling). Esto no es eficiente. WebSocket en JavaScript resuelve este problema: una vez establecida la conexión, el servidor puede enviar datos en cualquier momento.
WebSocket en Node.js (biblioteca ws)
Instala la biblioteca: npm install ws
Servidor:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8081 });
wss.on('connection', (ws) => { console.log('Cliente WebSocket conectado');
ws.on('message', (message) => { console.log('Recibido:',