Módulo net 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
- Crear servidores y clientes TCP
- Crear servidores y clientes IPC (comunicación entre procesos)
- Manejar conexiones de red y transferencia de datos
- Gestionar el ciclo de vida de las conexiones de red
Uso básico
Crear servidor TCP
Ejemplo
// 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
// 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 opcionalallowHalfOpen: si se permiten conexiones half-open, por defecto falsepauseOnConnect: 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 redfamily: 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
connect: se dispara cuando la conexión se establece correctamentedata: se dispara cuando se reciben datosend: se dispara cuando el otro extremo de la conexión envía un paquete FINtimeout: se dispara cuando la conexión excede el tiempo de espera por inactividaderror: se dispara cuando ocurre un errorclose: se dispara cuando el socket se cierra por completo
Métodos comunes
write(data[, encoding][, callback]): enviar datos a través del socketend([data][, encoding]): semi-cerrar el socketdestroy(): asegurar que no se realicen más actividades de E/S en este socketpause(): pausar la lectura de datosresume(): reanudar la lectura de datos
Aplicaciones avanzadas
Manejo de múltiples conexiones de clientes
Ejemplo
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
// 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
| Funcionalidad | Descripción |
|---|---|
| Crear servidor | net.createServer([options][, connectionListener]): se utiliza para crear servidores TCP, puede escuchar solicitudes de conexión. |
| Conectar al servidor | net.connect(options[, connectListener])onet.createConnection(options[, connectListener]): se utiliza para conectarse al servidor especificado (crea un cliente). |
| Objeto Socket | socketEl 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 |
|---|---|
| 1 | net.createServer([options][, connectionListener]) Crea un servidor TCP. El parámetro connectionListener agrega automáticamente un listener al evento 'connection'. |
| 2 | net.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'. |
| 3 | net.createConnection(options[, connectionListener]) Crea una conexión TCP al puerto port y al host host. host por defecto es 'localhost'. |
| 4 | net.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'. |
| 5 | net.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'. |
| 6 | net.connect(path[, connectListener]) Crea un socket unix conectado a path. El parámetro connectListener se agregará como listener al evento 'connect'. Devuelve 'net.Socket'. |
| 7 | net.createConnection(path[, connectListener]) Crea un socket unix conectado a path. El parámetro connectListener se agregará como listener al evento 'connect'. Devuelve 'net.Socket'. |
| 8 | net.isIP(input) Detecta si la entrada es una dirección IP. Devuelve 4 para IPV4, 6 para IPV6 y 0 en otros casos. |
| 9 | net.isIPv4(input) Si la dirección de entrada es IPV4, devuelve true; de lo contrario, devuelve false. |
| 10 | net.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 |
|---|---|
| 1 | server.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. |
| 2 | server.listen(path[, callback]) Inicia un servidor de socket local mediante la conexión especificada por path. |
| 3 | server.listen(handle[, callback]) Conectar a través del handle especificado. |
| 4 | server.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. |
| 5 | server.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'. |
| 6 | server.address() El sistema operativo devuelve la dirección vinculada, el nombre de la familia de protocolos y el puerto del servidor. |
| 7 | server.unref() Si este es el único servidor activo en el sistema de eventos, llamar a unref permitirá que el programa salga. |
| 8 | server.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. |
| 9 | server.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 |
|---|---|
| 1 | listening Se dispara cuando el servidor se vincula al llamar a server.listen. |
| 2 | connection Se dispara cuando se crea una nueva conexión. socket es una instancia de net.Socket. |
| 3 | close 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. |
| 4 | error 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 |
|---|---|
| 1 | lookup Se dispara este evento después de resolver el dominio, pero antes de la conexión. No es aplicable a sockets UNIX. |
| 2 | connect Se dispara cuando la conexión del socket se establece correctamente. |
| 3 | data Se dispara cuando se reciben datos. |
| 4 | end Se dispara cuando el otro extremo del socket envía un paquete FIN. |
| 5 | timeout 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. |
| 6 | drain Se dispara cuando el búfer de escritura está vacío. Se puede usar para controlar la subida. |
| 7 | error Se dispara cuando ocurre un error. |
| 8 | close 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 |
|---|---|
| 1 | socket.bufferSize Esta propiedad muestra el número de bytes en el búfer de escritura. |
| 2 | socket.remoteAddress La dirección IP remota como cadena, por ejemplo: '74.125.127.100' o '2001:4860:a005::68'. |
| 3 | socket.remoteFamily La familia de protocolos IP remota como cadena, por ejemplo 'IPv4' o 'IPv6'. |
| 4 | socket.remotePort El puerto remoto, representado como número, por ejemplo: 80 o 21. |
| 5 | socket.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'. |
| 6 | socket.localPort La dirección del puerto local, representada como número. Por ejemplo: 80 o 21. |
| 7 | socket.bytesRead El número de bytes recibidos. |
| 8 | socket.bytesWritten El número de bytes enviados. |
Métodos
| N.º | Método y descripción |
|---|---|
| 1 | new net.Socket([options]) Construye un nuevo objeto socket. |
| 2 | socket.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. |
| 3 | socket.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. |
| 4 | socket.setEncoding([encoding]) Establece la codificación. |
| 5 | socket.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. |
| 6 | socket.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. |
| 7 | socket.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.). |
| 8 | socket.pause() Pausa la lectura de datos. Es decir, el evento 'data' no se disparará más. Es muy útil para controlar la subida. |
| 9 | socket.resume() Reanuda la lectura de datos después de haber llamado a pause(). |
| 10 | socket.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. |
| 11 | socket.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. |
| 12 | socket.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. |
| 13 | socket.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' }. |
| 14 | socket.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. |
| 15 | socket.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 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 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
- Aplicaciones de chat: Construir un servidor de chat en tiempo real
- Servidores de juegos: Manejar la interacción en tiempo real de múltiples jugadores
- Servidores proxy: Reenviar solicitudes de clientes
- Protocolos personalizados: Implementar protocolos específicos de la capa de aplicación
- Comunicación con dispositivos IoT: Comunicarse con dispositivos embebidos
Mejores prácticas
- Manejo de errores: Escuchar siempre el evento 'error'
- Gestión de recursos: Cerrar de manera oportuna las conexiones que ya no se utilizan
- Consideraciones de rendimiento: Para escenarios de alta concurrencia, considera usar un pool de conexiones
- Seguridad: Implementar mecanismos adecuados de autenticación y cifrado
- Registro de logs: Registrar eventos y datos importantes de las conexiones
Ejemplo
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.
Otras extensiones
Módulos integrados de Node.js