Módulo net de Node.js

Java FileMódulos integrados de Node.js


De Node.jsnetEl módulo es un módulo central utilizado para crear servidores y clientes basados en TCP o IPC. Proporciona capacidades de programación de red asincrónica y se puede utilizar para construir diversas aplicaciones de red, como servidores de chat, servidores proxy, etc.

Funciones principales

  1. Crear servidores y clientes TCP
  2. Crear servidores y clientes IPC (comunicación entre procesos)
  3. Manejar conexiones de red y transferencia de datos
  4. Gestionar el ciclo de vida de las conexiones de red

Uso básico

Crear servidor TCP

Ejemplo

const net = require('net');

// Crear servidor TCP
const server = net.createServer((socket) => {
  console.log('Cliente conectado');
 
  // Recibir datos del cliente
  socket.on('data', (data) => {
    console.log(`Datos recibidos: ${data}`);
    socket.write(`Servidor recibió: ${data}`); // Enviar datos al cliente
  });
 
  // El cliente se desconectó
  socket.on('end', () => {
    console.log('Cliente desconectado');
  });
});

// Escuchar en el puerto 3000
server.listen(3000, () => {
  console.log('El servidor está escuchando en el puerto 3000');
});

Crear cliente TCP

Ejemplo

const net = require('net');

// Crear cliente y conectarse al servidor
const client = net.createConnection({ port: 3000 }, () => {
  console.log('Conectado al servidor');
  client.write('Hello Server!'); // Enviar datos al servidor
});

// Recibir datos del servidor
client.on('data', (data) => {
  console.log(`Datos recibidos del servidor: ${data}`);
  client.end(); // Desconectar
});

client.on('end', () => {
  console.log('Desconectado del servidor');
});

Explicación detallada de la API central

net.createServer([options][, connectionListener])

Crear un nuevo servidor TCP o IPC.

Parámetros:

  • options: objeto de configuración opcional
    • allowHalfOpen: si se permiten conexiones half-open, por defecto false
    • pauseOnConnect: si se pausa el socket al conectar, por defecto false
  • connectionListener: se establece automáticamente como listener del evento 'connection'

net.createConnection(options[, connectListener])

Crear una conexión TCP al puerto y host especificados.

Opciones comunes:

  • port: el puerto al que conectarse (obligatorio)
  • host: el host al que conectarse, por defecto 'localhost'
  • localAddress: la interfaz local utilizada para vincular la conexión de red
  • family: familia de protocolos IP (4 o 6)

Socket de red

net.SocketEs la clase central del módulo net, representa una conexión de red.

Eventos comunes

  1. connect: se dispara cuando la conexión se establece correctamente
  2. data: se dispara cuando se reciben datos
  3. end: se dispara cuando el otro extremo de la conexión envía un paquete FIN
  4. timeout: se dispara cuando la conexión excede el tiempo de espera por inactividad
  5. error: se dispara cuando ocurre un error
  6. close: se dispara cuando el socket se cierra por completo

Métodos comunes

  1. write(data[, encoding][, callback]): enviar datos a través del socket
  2. end([data][, encoding]): semi-cerrar el socket
  3. destroy(): asegurar que no se realicen más actividades de E/S en este socket
  4. pause(): pausar la lectura de datos
  5. resume(): reanudar la lectura de datos

Aplicaciones avanzadas

Manejo de múltiples conexiones de clientes

Ejemplo

const net = require('net');

const server = net.createServer((socket) => {
  // Establecer un ID único para cada conexión
  socket.id = Date.now();
 
  console.log(`Cliente ${socket.id}conectado`);
 
  socket.on('data', (data) => {
    console.log(`Del cliente ${socket.id}datos recibidos: ${data}`);
    // Transmitir mensaje a todos los clientes
    server.getConnections((err, count) => {
      if (count > 1) {
        socket.write(`Hay ${count-1}otros clientes en línea`);
      }
    });
  });
 
  socket.on('end', () => {
    console.log(`Cliente ${socket.id}desconectado`);
  });
});

server.listen(3000);

Manejo de tiempos de espera

Ejemplo

const server = net.createServer((socket) => {
  // Establecer el tiempo de espera de conexión en 5 minutos
  socket.setTimeout(5 * 60 * 1000);
 
  socket.on('timeout', () => {
    console.log('Tiempo de espera agotado, se desconectará');
    socket.end();
  });
});

Métodos y propiedades

FuncionalidadDescripción
Crear servidornet.createServer([options][, connectionListener]): se utiliza para crear servidores TCP, puede escuchar solicitudes de conexión.
Conectar al servidornet.connect(options[, connectListener])onet.createConnection(options[, connectListener]): se utiliza para conectarse al servidor especificado (crea un cliente).
Objeto SocketsocketEl objeto representa una conexión con un servidor o cliente TCP, y contiene múltiples métodos para enviar, recibir y cerrar conexiones.

Métodos

N.ºMétodo y descripción
1net.createServer([options][, connectionListener])
Crea un servidor TCP. El parámetro connectionListener agrega automáticamente un listener al evento 'connection'.
2net.connect(options[, connectionListener])
Devuelve un nuevo 'net.Socket' y se conecta a la dirección y puerto especificados.
Cuando el socket se establece, se disparará el evento 'connect'.
3net.createConnection(options[, connectionListener])
Crea una conexión TCP al puerto port y al host host. host por defecto es 'localhost'.
4net.connect(port[, host][, connectListener])
Crea una conexión TCP con puerto port y host host. host por defecto es 'localhost'. El parámetro connectListener se agregará como listener al evento 'connect'. Devuelve 'net.Socket'.
5net.createConnection(port[, host][, connectListener])
Crea una conexión TCP con puerto port y host host. host por defecto es 'localhost'. El parámetro connectListener se agregará como listener al evento 'connect'. Devuelve 'net.Socket'.
6net.connect(path[, connectListener])
Crea un socket unix conectado a path. El parámetro connectListener se agregará como listener al evento 'connect'. Devuelve 'net.Socket'.
7net.createConnection(path[, connectListener])
Crea un socket unix conectado a path. El parámetro connectListener se agregará como listener al evento 'connect'. Devuelve 'net.Socket'.
8net.isIP(input)
Detecta si la entrada es una dirección IP. Devuelve 4 para IPV4, 6 para IPV6 y 0 en otros casos.
9net.isIPv4(input)
Si la dirección de entrada es IPV4, devuelve true; de lo contrario, devuelve false.
10net.isIPv6(input)
Si la dirección de entrada es IPV6, devuelve true; de lo contrario, devuelve false.

net.Server

`net.Server` generalmente se utiliza para crear un servidor TCP o local.

N.ºMétodo & descripción
1server.listen(port[, host][, backlog][, callback])
Escucha el puerto port y el host host para conexiones. Por defecto, host acepta conexiones directas desde cualquier dirección IPv4 (INADDR_ANY). Cuando el puerto port es 0, se asigna un puerto aleatorio.
2server.listen(path[, callback])
Inicia un servidor de socket local mediante la conexión especificada por path.
3server.listen(handle[, callback])
Conectar a través del handle especificado.
4server.listen(options[, callback])
Las propiedades de options son: puerto port, host host y backlog, así como el parámetro opcional callback. Todos juntos llaman a server.listen(port, [host], [backlog], [callback]). Además, el parámetro path se puede usar para especificar un socket UNIX.
5server.close([callback])
El servidor deja de aceptar nuevas conexiones y mantiene las existentes. Esta es una función asincrónica; cuando todas las conexiones terminen, el servidor se cerrará y se disparará el evento 'close'.
6server.address()
El sistema operativo devuelve la dirección vinculada, el nombre de la familia de protocolos y el puerto del servidor.
7server.unref()
Si este es el único servidor activo en el sistema de eventos, llamar a unref permitirá que el programa salga.
8server.ref()
Lo contrario de unref: si este es el único servidor, llamar a ref en un servidor que previamente fue unref no hará que el programa salga (comportamiento predeterminado). Si el servidor ya ha sido ref, volver a llamar a ref no tendrá ningún efecto.
9server.getConnections(callback)
Obtener de forma asíncrona el número de conexiones activas actuales del servidor. Solo es efectivo después de que el socket se envía al proceso hijo; la función de callback tiene 2 parámetros: err y count.

Eventos

N.ºEvento y descripción
1listening
Se dispara cuando el servidor se vincula al llamar a server.listen.
2connection
Se dispara cuando se crea una nueva conexión. socket es una instancia de net.Socket.
3close
Se dispara cuando el servidor se cierra. Ten en cuenta que si hay conexiones, este evento no se activará hasta que todas las conexiones se cierren.
4error
Se dispara cuando ocurre un error. El evento 'close' se llamará directamente después de este evento.

net.Socket

El objeto net.Socket es una abstracción de un socket TCP o UNIX. Las instancias de net.Socket implementan una interfaz de flujo dúplex. Pueden ser utilizadas cuando el usuario crea un cliente (usando connect()), o pueden ser creadas por Node y pasadas al usuario a través del evento 'connection' del servidor.

Eventos

Los eventos de net.Socket son:

N.ºEvento y descripción
1lookup
Se dispara este evento después de resolver el dominio, pero antes de la conexión. No es aplicable a sockets UNIX.
2connect
Se dispara cuando la conexión del socket se establece correctamente.
3data
Se dispara cuando se reciben datos.
4end
Se dispara cuando el otro extremo del socket envía un paquete FIN.
5timeout
Se dispara cuando el socket supera el tiempo de inactividad; solo indica que el socket ha estado inactivo. El usuario debe cerrar la conexión manualmente.
6drain
Se dispara cuando el búfer de escritura está vacío. Se puede usar para controlar la subida.
7error
Se dispara cuando ocurre un error.
8close
Se dispara cuando el socket se cierra por completo. El parámetro had_error es un valor booleano que indica si el socket se cerró debido a un error de transmisión.

Propiedades

net.Socket proporciona muchas propiedades útiles para facilitar el control de la interacción con el socket:

N.ºPropiedad y descripción
1socket.bufferSize
Esta propiedad muestra el número de bytes en el búfer de escritura.
2socket.remoteAddress
La dirección IP remota como cadena, por ejemplo: '74.125.127.100' o '2001:4860:a005::68'.
3socket.remoteFamily
La familia de protocolos IP remota como cadena, por ejemplo 'IPv4' o 'IPv6'.
4socket.remotePort
El puerto remoto, representado como número, por ejemplo: 80 o 21.
5socket.localAddress
La interfaz local a la que está vinculada la conexión de red: la dirección IP local a la que se está conectando el cliente remoto, representada como cadena. Por ejemplo, si estás escuchando en '0.0.0.0' y el cliente se conecta a '192.168.1.1', este valor será '192.168.1.1'.
6socket.localPort
La dirección del puerto local, representada como número. Por ejemplo: 80 o 21.
7socket.bytesRead
El número de bytes recibidos.
8socket.bytesWritten
El número de bytes enviados.

Métodos

N.ºMétodo y descripción
1new net.Socket([options])
Construye un nuevo objeto socket.
2socket.connect(port[, host][, connectListener])
Crea una conexión de socket especificando el puerto port y el host host. El parámetro host tiene como valor predeterminado localhost. Normalmente no es necesario usar net.createConnection para abrir un socket. Solo se usa cuando has implementado tu propio socket.
3socket.connect(path[, connectListener])
Abre un socket Unix en la ruta especificada. Normalmente no es necesario usar net.createConnection para abrir un socket. Solo se utiliza si has implementado tu propio socket.
4socket.setEncoding([encoding])
Establece la codificación.
5socket.write(data[, encoding][, callback])
Envía datos en el socket. El segundo parámetro especifica la codificación de la cadena; por defecto es UTF8.
6socket.end([data][, encoding])
Cierra el socket a medias (half-close). Por ejemplo, envía un paquete FIN. Puede que el servidor todavía esté enviando datos.
7socket.destroy()
Asegura que no haya actividad de E/S en este socket. Solo es necesario en caso de que ocurra un error (manejo de errores, etc.).
8socket.pause()
Pausa la lectura de datos. Es decir, el evento 'data' no se disparará más. Es muy útil para controlar la subida.
9socket.resume()
Reanuda la lectura de datos después de haber llamado a pause().
10socket.setTimeout(timeout[, callback])
Establece un tiempo de espera (timeout) para el socket: se considera en tiempo de espera agotado si permanece inactivo durante más de timeout milisegundos.
11socket.setNoDelay([noDelay])
Deshabilita el algoritmo de Nagle. De forma predeterminada, las conexiones TCP usan el algoritmo de Nagle, que almacena datos en búfer antes de enviarlos. Establecer noDelay en true hará que los datos se envíen inmediatamente al llamar a socket.write(). El valor predeterminado de noDelay es true.
12socket.setKeepAlive([enable][, initialDelay])
Deshabilita/habilita la función de keep-alive y, opcionalmente, establece un retraso inicial antes de enviar la primera sonda de keep-alive en un socket inactivo. El valor predeterminado es false. Establece initialDelay (en milisegundos) para definir el retraso entre el último paquete recibido y la primera sonda de keep-alive. Si se establece initialDelay en 0, se conservará el valor predeterminado (o anterior). El valor predeterminado es 0.
13socket.address()
El sistema operativo devuelve la dirección vinculada, el nombre de la familia de protocolos y el puerto del servidor. El objeto devuelto tiene 3 propiedades, por ejemplo { port: 12346, family: 'IPv4', address: '127.0.0.1' }.
14socket.unref()
Si este es el único servidor activo en el sistema de eventos, llamar a unref permitirá que el programa salga. Si el servidor ya está en estado unref, llamar a unref de nuevo no tendrá ningún efecto.
15socket.ref()
Lo contrario de unref: si este es el único servidor, llamar a ref en un servidor previamente unref no hará que el programa salga (comportamiento predeterminado). Si el servidor ya está en estado ref, llamar a ref de nuevo no tendrá efecto.

Ejemplo

Crea un archivo server.js, con el siguiente código:

Ejemplo

var net = require('net');
var server = net.createServer(function(connection) {
   console.log('client connected');
   connection.on('end', function() {
      console.log('El cliente cerró la conexión');
   });
   connection.write('Hello World!\r\n');
   connection.pipe(connection);
});
server.listen(8080, function() {
  console.log('server is listening');
});

Ejecuta el código del servidor anterior:

$ node server.js
server is listening   # 服务已创建并监听 8080 端口

Abre una nueva ventana, crea un archivo client.js, con el siguiente código:

Ejemplo

var net = require('net');
var client = net.connect({port: 8080}, function() {
   console.log('¡Conectado al servidor!');  
});
client.on('data', function(data) {
   console.log(data.toString());
   client.end();
});
client.on('end', function() {
   console.log('Desconectado del servidor');
});

Ejecuta el código del cliente anterior:

连接到服务器!
Hello World!

断开与服务器的连接

Demostración de ejemplo en GIF


Escenarios de aplicación práctica

  1. Aplicaciones de chat: Construir un servidor de chat en tiempo real
  2. Servidores de juegos: Manejar la interacción en tiempo real de múltiples jugadores
  3. Servidores proxy: Reenviar solicitudes de clientes
  4. Protocolos personalizados: Implementar protocolos específicos de la capa de aplicación
  5. Comunicación con dispositivos IoT: Comunicarse con dispositivos embebidos

Mejores prácticas

  1. Manejo de errores: Escuchar siempre el evento 'error'
  2. Gestión de recursos: Cerrar de manera oportuna las conexiones que ya no se utilizan
  3. Consideraciones de rendimiento: Para escenarios de alta concurrencia, considera usar un pool de conexiones
  4. Seguridad: Implementar mecanismos adecuados de autenticación y cifrado
  5. Registro de logs: Registrar eventos y datos importantes de las conexiones

Ejemplo

// Ejemplo: manejo completo de errores
server.on('error', (err) => {
  console.error('Error del servidor:', err);
});

client.on('error', (err) => {
  console.error('Error del cliente:', err);
});

Al dominar el módulo net, podrás construir varias aplicaciones de red potentes, comprender los principios de la comunicación de red de bajo nivel y sentar una base sólida para aprender marcos de red más avanzados.

Java FileMódulos integrados de Node.js

Otras extensiones