Skip to content

Net

[Estable: 2 - Estable]

Estable: 2 Estabilidad: 2 - Estable

Código Fuente: lib/net.js

El módulo node:net proporciona una API de red asíncrona para crear servidores TCP basados en flujos o IPC (net.createServer()) y clientes (net.createConnection()).

Se puede acceder utilizando:

js
import net from 'node:net';
js
const net = require('node:net');

Soporte IPC

[Historial]

VersiónCambios
v20.8.0Soporte para enlazar a la ruta del socket de dominio Unix abstracto como \0abstract. Podemos enlazar '\0' para Node.js \< v20.4.0.

El módulo node:net admite IPC con named pipes en Windows y sockets de dominio Unix en otros sistemas operativos.

Identificación de rutas para conexiones IPC

net.connect(), net.createConnection(), server.listen() y socket.connect() toman un parámetro path para identificar los puntos finales de IPC.

En Unix, el dominio local también se conoce como dominio Unix. La ruta es un nombre de ruta del sistema de archivos. Arrojará un error cuando la longitud del nombre de ruta sea mayor que la longitud de sizeof(sockaddr_un.sun_path). Los valores típicos son 107 bytes en Linux y 103 bytes en macOS. Si una abstracción de API de Node.js crea el socket de dominio Unix, también desenlazará el socket de dominio Unix. Por ejemplo, net.createServer() puede crear un socket de dominio Unix y server.close() lo desenlazará. Pero si un usuario crea el socket de dominio Unix fuera de estas abstracciones, el usuario deberá eliminarlo. Lo mismo se aplica cuando una API de Node.js crea un socket de dominio Unix pero el programa falla. En resumen, un socket de dominio Unix será visible en el sistema de archivos y persistirá hasta que se desenlace. En Linux, puede usar el socket abstracto de Unix agregando \0 al principio de la ruta, como \0abstract. La ruta al socket abstracto de Unix no es visible en el sistema de archivos y desaparecerá automáticamente cuando se cierren todas las referencias abiertas al socket.

En Windows, el dominio local se implementa mediante un named pipe. La ruta debe referirse a una entrada en \\?\pipe\ o \\.\pipe\. Se permite cualquier carácter, pero este último puede realizar algún procesamiento de nombres de pipes, como resolver secuencias ... A pesar de cómo podría parecer, el espacio de nombres del pipe es plano. Los pipes no persistirán. Se eliminan cuando se cierra la última referencia a ellos. A diferencia de los sockets de dominio Unix, Windows cerrará y eliminará el pipe cuando el proceso propietario finalice.

El escape de cadenas de JavaScript requiere que las rutas se especifiquen con un escape de barra invertida adicional como:

js
net.createServer().listen(
  path.join('\\\\?\\pipe', process.cwd(), 'myctl'));

Clase: net.BlockList

Agregada en: v15.0.0, v14.18.0

El objeto BlockList se puede utilizar con algunas API de red para especificar reglas para deshabilitar el acceso entrante o saliente a direcciones IP, rangos de IP o subredes IP específicas.

blockList.addAddress(address[, type])

Agregada en: v15.0.0, v14.18.0

Agrega una regla para bloquear la dirección IP dada.

blockList.addRange(start, end[, type])

Agregada en: v15.0.0, v14.18.0

Agrega una regla para bloquear un rango de direcciones IP desde start (inclusivo) hasta end (inclusivo).

blockList.addSubnet(net, prefix[, type])

Agregada en: v15.0.0, v14.18.0

  • net <string> | <net.SocketAddress> La dirección de red IPv4 o IPv6.
  • prefix <number> El número de bits del prefijo CIDR. Para IPv4, este debe ser un valor entre 0 y 32. Para IPv6, este debe estar entre 0 y 128.
  • type <string> Ya sea 'ipv4' o 'ipv6'. Predeterminado: 'ipv4'.

Agrega una regla para bloquear un rango de direcciones IP especificadas como una máscara de subred.

blockList.check(address[, type])

Agregado en: v15.0.0, v14.18.0

Devuelve true si la dirección IP dada coincide con alguna de las reglas agregadas a la BlockList.

js
const blockList = new net.BlockList();
blockList.addAddress('123.123.123.123');
blockList.addRange('10.0.0.1', '10.0.0.10');
blockList.addSubnet('8592:757c:efae:4e45::', 64, 'ipv6');

console.log(blockList.check('123.123.123.123'));  // Imprime: true
console.log(blockList.check('10.0.0.3'));  // Imprime: true
console.log(blockList.check('222.111.111.222'));  // Imprime: false

// La notación IPv6 para direcciones IPv4 funciona:
console.log(blockList.check('::ffff:7b7b:7b7b', 'ipv6')); // Imprime: true
console.log(blockList.check('::ffff:123.123.123.123', 'ipv6')); // Imprime: true

blockList.rules

Agregado en: v15.0.0, v14.18.0

La lista de reglas añadidas a la lista de bloqueo.

BlockList.isBlockList(value)

Agregado en: v23.4.0

  • value <any> Cualquier valor JS
  • Devuelve true si el value es un net.BlockList.

Clase: net.SocketAddress

Agregado en: v15.14.0, v14.18.0

new net.SocketAddress([options])

Agregado en: v15.14.0, v14.18.0

  • options <Object>
    • address <string> La dirección de red como una cadena IPv4 o IPv6. Predeterminado: '127.0.0.1' si family es 'ipv4'; '::' si family es 'ipv6'.
    • family <string> Uno de 'ipv4' o 'ipv6'. Predeterminado: 'ipv4'.
    • flowlabel <number> Una etiqueta de flujo IPv6 utilizada solo si family es 'ipv6'.
    • port <number> Un puerto IP.

socketaddress.address

Agregado en: v15.14.0, v14.18.0

socketaddress.family

Agregado en: v15.14.0, v14.18.0

socketaddress.flowlabel

Agregado en: v15.14.0, v14.18.0

socketaddress.port

Agregado en: v15.14.0, v14.18.0

SocketAddress.parse(input)

Agregado en: v23.4.0

  • input <string> Una cadena de entrada que contiene una dirección IP y un puerto opcional, por ejemplo, 123.1.2.3:1234 o [1::1]:1234.
  • Devuelve: <net.SocketAddress> Devuelve un SocketAddress si el análisis fue exitoso. De lo contrario, devuelve undefined.

Clase: net.Server

Agregado en: v0.1.90

Esta clase se utiliza para crear un servidor TCP o IPC.

new net.Server([options][, connectionListener])

net.Server es un EventEmitter con los siguientes eventos:

Evento: 'close'

Agregado en: v0.5.0

Se emite cuando el servidor se cierra. Si existen conexiones, este evento no se emite hasta que todas las conexiones hayan finalizado.

Evento: 'connection'

Agregado en: v0.1.90

Emitido cuando se realiza una nueva conexión. socket es una instancia de net.Socket.

Evento: 'error'

Agregado en: v0.1.90

Emitido cuando ocurre un error. A diferencia de net.Socket, el evento 'close' no se emitirá directamente después de este evento a menos que se llame manualmente a server.close(). Consulte el ejemplo en la discusión de server.listen().

Evento: 'listening'

Agregado en: v0.1.90

Emitido cuando el servidor se ha enlazado después de llamar a server.listen().

Evento: 'drop'

Agregado en: v18.6.0, v16.17.0

Cuando el número de conexiones alcanza el umbral de server.maxConnections, el servidor descartará nuevas conexiones y emitirá el evento 'drop' en su lugar. Si es un servidor TCP, el argumento es el siguiente, de lo contrario el argumento es undefined.

  • data <Object> El argumento pasado al escuchador de eventos.
    • localAddress <string> Dirección local.
    • localPort <number> Puerto local.
    • localFamily <string> Familia local.
    • remoteAddress <string> Dirección remota.
    • remotePort <number> Puerto remoto.
    • remoteFamily <string> Familia de IP remota. 'IPv4' o 'IPv6'.

server.address()

[Historial]

VersiónCambios
v18.4.0La propiedad family ahora devuelve una cadena en lugar de un número.
v18.0.0La propiedad family ahora devuelve un número en lugar de una cadena.
v0.1.90Añadido en: v0.1.90

Devuelve la dirección enlazada, el nombre de la family de la dirección y el puerto del servidor tal como lo informa el sistema operativo si está escuchando en un socket IP (útil para averiguar qué puerto se asignó al obtener una dirección asignada por el sistema operativo): { port: 12346, family: 'IPv4', address: '127.0.0.1' }.

Para un servidor que escucha en una tubería o socket de dominio Unix, el nombre se devuelve como una cadena.

js
const server = net.createServer((socket) => {
  socket.end('adiós\n');
}).on('error', (err) => {
  // Manejar errores aquí.
  throw err;
});

// Tomar un puerto arbitrario no utilizado.
server.listen(() => {
  console.log('servidor abierto en', server.address());
});

server.address() devuelve null antes de que se haya emitido el evento 'listening' o después de llamar a server.close().

server.close([callback])

Añadido en: v0.1.90

Impide que el servidor acepte nuevas conexiones y mantiene las conexiones existentes. Esta función es asíncrona, el servidor finalmente se cierra cuando todas las conexiones finalizan y el servidor emite un evento 'close'. La callback opcional se llamará una vez que se produzca el evento 'close'. A diferencia de ese evento, se llamará con un Error como su único argumento si el servidor no estaba abierto cuando se cerró.

server[Symbol.asyncDispose]()

Agregado en: v20.5.0, v18.18.0

[Estable: 1 - Experimental]

Estable: 1 Estabilidad: 1 - Experimental

Llama a server.close() y devuelve una promesa que se cumple cuando el servidor se ha cerrado.

server.getConnections(callback)

Agregado en: v0.9.7

Obtiene de forma asíncrona el número de conexiones simultáneas en el servidor. Funciona cuando los sockets se enviaron a forks.

El callback debe tomar dos argumentos err y count.

server.listen()

Inicia un servidor que escucha las conexiones. Un net.Server puede ser un servidor TCP o un servidor IPC dependiendo de lo que escuche.

Posibles firmas:

Esta función es asíncrona. Cuando el servidor comienza a escuchar, se emitirá el evento 'listening'. El último parámetro callback se añadirá como listener para el evento 'listening'.

Todos los métodos listen() pueden tomar un parámetro backlog para especificar la longitud máxima de la cola de conexiones pendientes. La longitud real será determinada por el SO a través de ajustes sysctl como tcp_max_syn_backlog y somaxconn en Linux. El valor predeterminado de este parámetro es 511 (no 512).

Todos los net.Socket se establecen en SO_REUSEADDR (ver socket(7) para más detalles).

El método server.listen() puede ser llamado de nuevo si y sólo si hubo un error durante la primera llamada a server.listen() o server.close() ha sido llamado. De lo contrario, se lanzará un error ERR_SERVER_ALREADY_LISTEN.

Uno de los errores más comunes que se producen al escuchar es EADDRINUSE. Esto ocurre cuando otro servidor ya está escuchando en el port/path/handle solicitado. Una forma de manejar esto sería reintentar después de un cierto tiempo:

js
server.on('error', (e) => {
  if (e.code === 'EADDRINUSE') {
    console.error('Dirección en uso, reintentando...');
    setTimeout(() => {
      server.close();
      server.listen(PORT, HOST);
    }, 1000);
  }
});

server.listen(handle[, backlog][, callback])

Agregado en: v0.5.10

Inicia un servidor que escucha las conexiones en un handle dado que ya se ha enlazado a un puerto, un socket de dominio Unix o una tubería con nombre de Windows.

El objeto handle puede ser un servidor, un socket (cualquier cosa con un miembro _handle subyacente) o un objeto con un miembro fd que sea un descriptor de archivo válido.

La escucha en un descriptor de archivo no es compatible con Windows.

server.listen(options[, callback])

[Historial]

VersiónCambios
v23.1.0Se admite la opción reusePort.
v15.6.0Se añadió la compatibilidad con AbortSignal.
v11.4.0Se admite la opción ipv6Only.
v0.11.14Agregado en: v0.11.14
  • options <Objeto> Obligatorio. Admite las siguientes propiedades:

    • backlog <number> Parámetro común de las funciones server.listen().
    • exclusive <boolean> Predeterminado: false
    • host <string>
    • ipv6Only <boolean> Para los servidores TCP, establecer ipv6Only en true desactivará la compatibilidad con doble pila, es decir, enlazar con el host :: no hará que 0.0.0.0 se enlace. Predeterminado: false.
    • reusePort <boolean> Para los servidores TCP, establecer reusePort en true permite que varios sockets en el mismo host se enlacen al mismo puerto. El sistema operativo distribuye las conexiones entrantes a los sockets de escucha. Esta opción solo está disponible en algunas plataformas, como Linux 3.9+, DragonFlyBSD 3.6+, FreeBSD 12.0+, Solaris 11.4 y AIX 7.2.5+. Predeterminado: false.
    • path <string> Se ignorará si se especifica port. Véase Identificación de rutas para conexiones IPC.
    • port <number>
    • readableAll <boolean> Para los servidores IPC, hace que la tubería sea legible para todos los usuarios. Predeterminado: false.
    • signal <AbortSignal> Un AbortSignal que se puede utilizar para cerrar un servidor de escucha.
    • writableAll <boolean> Para los servidores IPC, hace que la tubería se pueda escribir para todos los usuarios. Predeterminado: false.
  • callback <Función> funciones.

  • Devuelve: <net.Server>

Si se especifica port, se comporta de la misma manera que server.listen([port[, host[, backlog]]][, callback]). De lo contrario, si se especifica path, se comporta de la misma manera que server.listen(path[, backlog][, callback]). Si no se especifica ninguno de ellos, se producirá un error.

Si exclusive es false (predeterminado), entonces los workers del clúster utilizarán el mismo handle subyacente, lo que permitirá que se compartan las tareas de gestión de la conexión. Cuando exclusive es true, el handle no se comparte y el intento de compartir el puerto provoca un error. A continuación se muestra un ejemplo de escucha en un puerto exclusivo.

js
server.listen({
  host: 'localhost',
  port: 80,
  exclusive: true,
});

Cuando exclusive es true y el handle subyacente se comparte, es posible que varios workers consulten un handle con diferentes backlogs. En este caso, se utilizará el primer backlog pasado al proceso maestro.

El inicio de un servidor IPC como root puede hacer que la ruta del servidor sea inaccesible para los usuarios sin privilegios. El uso de readableAll y writableAll hará que el servidor sea accesible para todos los usuarios.

Si la opción signal está habilitada, llamar a .abort() en el AbortController correspondiente es similar a llamar a .close() en el servidor:

js
const controller = new AbortController();
server.listen({
  host: 'localhost',
  port: 80,
  signal: controller.signal,
});
// Más tarde, cuando quieras cerrar el servidor.
controller.abort();

server.listen(path[, backlog][, callback])

Añadido en: v0.1.90

Inicia un servidor IPC escuchando conexiones en la ruta dada.

server.listen([port[, host[, backlog]]][, callback])

Añadido en: v0.1.90

Inicia un servidor TCP escuchando conexiones en el puerto y host dados.

Si se omite port o es 0, el sistema operativo asignará un puerto no utilizado arbitrario, que se puede recuperar usando server.address().port después de que se haya emitido el evento 'listening'.

Si se omite host, el servidor aceptará conexiones en la dirección IPv6 no especificada (::) cuando IPv6 esté disponible, o la dirección IPv4 no especificada (0.0.0.0) de lo contrario.

En la mayoría de los sistemas operativos, escuchar la dirección IPv6 no especificada (::) puede hacer que net.Server también escuche la dirección IPv4 no especificada (0.0.0.0).

server.listening

Agregado en: v5.7.0

  • <boolean> Indica si el servidor está escuchando o no las conexiones.

server.maxConnections

[Historial]

VersiónCambios
v21.0.0Establecer maxConnections a 0 descarta todas las conexiones entrantes. Anteriormente, se interpretaba como Infinity.
v0.2.0Agregado en: v0.2.0

Cuando el número de conexiones alcanza el umbral de server.maxConnections:

No se recomienda utilizar esta opción una vez que un socket ha sido enviado a un hijo con child_process.fork().

server.dropMaxConnection

Agregado en: v23.1.0

Establezca esta propiedad en true para comenzar a cerrar las conexiones una vez que el número de conexiones alcance el umbral de [server.maxConnections][]. Esta configuración solo es efectiva en modo clúster.

server.ref()

Agregado en: v0.9.1

Opuesto a unref(), llamar a ref() en un servidor previamente unref no permitirá que el programa se cierre si es el único servidor que queda (el comportamiento predeterminado). Si el servidor está refdo, llamar a ref() nuevamente no tendrá ningún efecto.

server.unref()

Agregado en: v0.9.1

Llamar a unref() en un servidor permitirá que el programa se cierre si este es el único servidor activo en el sistema de eventos. Si el servidor ya está unrefdo, llamar a unref() nuevamente no tendrá ningún efecto.

Clase: net.Socket

Agregado en: v0.3.4

Esta clase es una abstracción de un socket TCP o un punto final de IPC de transmisión (utiliza tuberías con nombre en Windows y sockets de dominio Unix en otros casos). También es un EventEmitter.

Un net.Socket puede ser creado por el usuario y utilizado directamente para interactuar con un servidor. Por ejemplo, es retornado por net.createConnection(), por lo que el usuario puede utilizarlo para hablar con el servidor.

También puede ser creado por Node.js y pasado al usuario cuando se recibe una conexión. Por ejemplo, se pasa a los listeners de un evento 'connection' emitido en un net.Server, por lo que el usuario puede utilizarlo para interactuar con el cliente.

new net.Socket([options])

[Historial]

VersiónCambios
v15.14.0Se agregó soporte para AbortSignal.
v12.10.0Se agregó la opción onread.
v0.3.4Agregado en: v0.3.4
  • options <Objeto> Las opciones disponibles son:

    • allowHalfOpen <booleano> Si se establece en false, el socket finalizará automáticamente el lado de escritura cuando finalice el lado de lectura. Consulte net.createServer() y el evento 'end' para obtener más detalles. Predeterminado: false.

    • fd <número> Si se especifica, envuelve un socket existente con el descriptor de archivo dado, de lo contrario, se creará un nuevo socket.

    • onread <Objeto> Si se especifica, los datos entrantes se almacenan en un único buffer y se pasan al callback proporcionado cuando llegan datos al socket. Esto hará que la funcionalidad de transmisión no proporcione ningún dato. El socket emitirá eventos como 'error', 'end' y 'close' como de costumbre. Los métodos como pause() y resume() también se comportarán como se espera.

    • buffer <Buffer> | <Uint8Array> | <Función> Ya sea un fragmento de memoria reutilizable para usar para almacenar datos entrantes o una función que devuelve tal.

    • callback <Función> Esta función se llama para cada fragmento de datos entrantes. Se le pasan dos argumentos: el número de bytes escritos en buffer y una referencia a buffer. Devuelve false desde esta función para pause() implícitamente el socket. Esta función se ejecutará en el contexto global.

    • readable <booleano> Permite lecturas en el socket cuando se pasa un fd, de lo contrario se ignora. Predeterminado: false.

    • signal <AbortSignal> Una señal de Abort que se puede usar para destruir el socket.

    • writable <booleano> Permite escrituras en el socket cuando se pasa un fd, de lo contrario se ignora. Predeterminado: false.

  • Devuelve: <net.Socket>

Crea un nuevo objeto socket.

El socket recién creado puede ser un socket TCP o un punto final IPC de transmisión, según a qué se connect().

Evento: 'close'

Añadido en: v0.1.90

  • hadError <boolean> true si el socket tuvo un error de transmisión.

Emitido una vez que el socket está completamente cerrado. El argumento hadError es un booleano que indica si el socket se cerró debido a un error de transmisión.

Evento: 'connect'

Añadido en: v0.1.90

Emitido cuando una conexión de socket se establece correctamente. Véase net.createConnection().

Evento: 'connectionAttempt'

Añadido en: v21.6.0, v20.12.0

  • ip <string> La IP a la que el socket está intentando conectarse.
  • port <number> El puerto al que el socket está intentando conectarse.
  • family <number> La familia de la IP. Puede ser 6 para IPv6 o 4 para IPv4.

Emitido cuando se inicia un nuevo intento de conexión. Esto puede emitirse varias veces si el algoritmo de selección automática de familia está habilitado en socket.connect(options).

Evento: 'connectionAttemptFailed'

Añadido en: v21.6.0, v20.12.0

  • ip <string> La IP a la que el socket intentó conectarse.
  • port <number> El puerto al que el socket intentó conectarse.
  • family <number> La familia de la IP. Puede ser 6 para IPv6 o 4 para IPv4.
  • error <Error> El error asociado al fallo.

Emitido cuando un intento de conexión falló. Esto puede emitirse varias veces si el algoritmo de selección automática de familia está habilitado en socket.connect(options).

Evento: 'connectionAttemptTimeout'

Añadido en: v21.6.0, v20.12.0

  • ip <string> La IP a la que el socket intentó conectarse.
  • port <number> El puerto al que el socket intentó conectarse.
  • family <number> La familia de la IP. Puede ser 6 para IPv6 o 4 para IPv4.

Emitido cuando un intento de conexión se agota. Esto solo se emite (y puede emitirse varias veces) si el algoritmo de selección automática de familia está habilitado en socket.connect(options).

Evento: 'data'

Añadido en: v0.1.90

Emitido cuando se reciben datos. El argumento data será un Buffer o String. La codificación de los datos se establece mediante socket.setEncoding().

Los datos se perderán si no hay ningún escucha cuando un Socket emite un evento 'data'.

Evento: 'drain'

Añadido en: v0.1.90

Emitido cuando el búfer de escritura se vacía. Se puede utilizar para regular las subidas.

Véase también: los valores de retorno de socket.write().

Evento: 'end'

Añadido en: v0.1.90

Emitido cuando el otro extremo del socket señala el final de la transmisión, terminando así el lado legible del socket.

Por defecto (allowHalfOpen es false), el socket enviará un paquete de fin de transmisión de vuelta y destruirá su descriptor de archivo una vez que haya escrito su cola de escritura pendiente. Sin embargo, si allowHalfOpen está establecido en true, el socket no end() automáticamente su lado grabable, permitiendo al usuario escribir cantidades arbitrarias de datos. El usuario debe llamar a end() explícitamente para cerrar la conexión (es decir, enviando un paquete FIN de vuelta).

Evento: 'error'

Añadido en: v0.1.90

Emitido cuando ocurre un error. El evento 'close' será llamado directamente después de este evento.

Evento: 'lookup'

[Historial]

VersiónCambios
v5.10.0El parámetro host ahora es compatible.
v0.11.3Añadido en: v0.11.3

Emitido después de resolver el nombre de host, pero antes de conectarse. No aplicable a los sockets Unix.

Evento: 'ready'

Añadido en: v9.11.0

Emitido cuando un socket está listo para ser usado.

Disparado inmediatamente después de 'connect'.

Evento: 'timeout'

Añadido en: v0.1.90

Emitido si el socket se agota por inactividad. Esto es solo para notificar que el socket ha estado inactivo. El usuario debe cerrar manualmente la conexión.

Véase también: socket.setTimeout().

socket.address()

[Historial]

VersiónCambios
v18.4.0La propiedad family ahora devuelve una cadena en lugar de un número.
v18.0.0La propiedad family ahora devuelve un número en lugar de una cadena.
v0.1.90Añadido en: v0.1.90

Devuelve la address enlazada, el nombre de la family de la dirección y el port del socket tal como lo informa el sistema operativo: { port: 12346, family: 'IPv4', address: '127.0.0.1' }

socket.autoSelectFamilyAttemptedAddresses

Añadido en: v19.4.0, v18.18.0

Esta propiedad solo está presente si el algoritmo de autoselección de familia está habilitado en socket.connect(options) y es un array de las direcciones que se han intentado.

Cada dirección es una cadena en la forma de $IP:$PUERTO. Si la conexión fue exitosa, entonces la última dirección es a la que el socket está conectado actualmente.

socket.bufferSize

Añadido en: v0.3.8

Obsoleto desde: v14.6.0

[Estable: 0 - Obsoleto]

Estable: 0 Estabilidad: 0 - Obsoleto: Use writable.writableLength en su lugar.

Esta propiedad muestra el número de caracteres almacenados en búfer para escribir. El búfer puede contener cadenas cuya longitud después de la codificación aún no se conoce. Por lo tanto, este número es solo una aproximación del número de bytes en el búfer.

net.Socket tiene la propiedad de que socket.write() siempre funciona. Esto es para ayudar a los usuarios a ponerse en marcha rápidamente. El ordenador no siempre puede seguir el ritmo de la cantidad de datos que se escriben en un socket. La conexión de red simplemente podría ser demasiado lenta. Node.js internamente pondrá en cola los datos escritos en un socket y los enviará a través del cable cuando sea posible.

La consecuencia de este almacenamiento en búfer interno es que la memoria puede crecer. Los usuarios que experimenten un bufferSize grande o creciente deben intentar "reducir" los flujos de datos en su programa con socket.pause() y socket.resume().

socket.bytesRead

Añadido en: v0.5.3

La cantidad de bytes recibidos.

socket.bytesWritten

Añadido en: v0.5.3

La cantidad de bytes enviados.

socket.connect()

Inicia una conexión en un socket dado.

Posibles firmas:

Esta función es asíncrona. Cuando se establece la conexión, se emitirá el evento 'connect'. Si hay un problema al conectar, en lugar de un evento 'connect', se emitirá un evento 'error' con el error pasado al listener 'error'. El último parámetro connectListener, si se proporciona, se agregará como listener para el evento 'connect' una vez.

Esta función solo debe usarse para volver a conectar un socket después de que se haya emitido 'close' o, de lo contrario, puede provocar un comportamiento indefinido.

socket.connect(options[, connectListener])

[Historial]

VersiónCambios
v19.4.0El valor predeterminado para la opción autoSelectFamily se puede cambiar en tiempo de ejecución utilizando setDefaultAutoSelectFamily o mediante la opción de línea de comandos --enable-network-family-autoselection.
v20.0.0, v18.18.0El valor predeterminado para la opción autoSelectFamily ahora es verdadero. El indicador CLI --enable-network-family-autoselection ha sido renombrado a --network-family-autoselection. El nombre antiguo ahora es un alias, pero se desaconseja.
v19.3.0, v18.13.0Se agregó la opción autoSelectFamily.
v17.7.0, v16.15.0Ahora se admiten las opciones noDelay, keepAlive y keepAliveInitialDelay.
v6.0.0La opción hints ahora tiene el valor predeterminado 0 en todos los casos. Anteriormente, en ausencia de la opción family, el valor predeterminado era `dns.ADDRCONFIG
v5.11.0Ahora se admite la opción hints.
v0.1.90Añadido en: v0.1.90

Inicia una conexión en un socket dado. Normalmente este método no es necesario, el socket debe crearse y abrirse con net.createConnection(). Utilice esto solo cuando implemente un Socket personalizado.

Para conexiones TCP, las options disponibles son:

  • autoSelectFamily <boolean>: Si se establece en true, habilita un algoritmo de autodetección de familia que implementa de manera flexible la sección 5 de RFC 8305. La opción all pasada a lookup se establece en true y los sockets intentan conectarse a todas las direcciones IPv6 e IPv4 obtenidas, en secuencia, hasta que se establece una conexión. Primero se intenta la primera dirección AAAA devuelta, luego la primera dirección A devuelta, luego la segunda dirección AAAA devuelta, y así sucesivamente. A cada intento de conexión (pero al último) se le da la cantidad de tiempo especificada por la opción autoSelectFamilyAttemptTimeout antes de que se agote el tiempo y se intente la siguiente dirección. Se ignora si la opción family no es 0 o si se establece localAddress. Los errores de conexión no se emiten si al menos una conexión tiene éxito. Si todos los intentos de conexión fallan, se emite un único AggregateError con todos los intentos fallidos. Predeterminado: net.getDefaultAutoSelectFamily().
  • autoSelectFamilyAttemptTimeout <number>: La cantidad de tiempo en milisegundos que se espera a que finalice un intento de conexión antes de intentar la siguiente dirección cuando se utiliza la opción autoSelectFamily. Si se establece en un entero positivo menor que 10, se utilizará el valor 10 en su lugar. Predeterminado: net.getDefaultAutoSelectFamilyAttemptTimeout().
  • family <number>: Versión de la pila IP. Debe ser 4, 6 o 0. El valor 0 indica que se permiten tanto direcciones IPv4 como IPv6. Predeterminado: 0.
  • hints <number> Opcional dns.lookup() sugerencias.
  • host <string> Host al que debe conectarse el socket. Predeterminado: 'localhost'.
  • keepAlive <boolean> Si se establece en true, habilita la funcionalidad keep-alive en el socket inmediatamente después de que se establece la conexión, de manera similar a lo que se hace en socket.setKeepAlive(). Predeterminado: false.
  • keepAliveInitialDelay <number> Si se establece en un número positivo, establece el retraso inicial antes de que se envíe la primera sonda keepalive en un socket inactivo. Predeterminado: 0.
  • localAddress <string> Dirección local desde la que debe conectarse el socket.
  • localPort <number> Puerto local desde el que debe conectarse el socket.
  • lookup <Function> Función de búsqueda personalizada. Predeterminado: dns.lookup().
  • noDelay <boolean> Si se establece en true, deshabilita el uso del algoritmo de Nagle inmediatamente después de que se establece el socket. Predeterminado: false.
  • port <number> Requerido. Puerto al que debe conectarse el socket.
  • blockList <net.BlockList> blockList se puede utilizar para deshabilitar el acceso de salida a direcciones IP, rangos de IP o subredes IP específicas.

Para conexiones IPC, las options disponibles son:

socket.connect(path[, connectListener])

Inicia una conexión IPC en el socket dado.

Alias de socket.connect(options[, connectListener]) llamado con { path: path } como options.

socket.connect(port[, host][, connectListener])

Agregado en: v0.1.90

Inicia una conexión TCP en el socket dado.

Alias de socket.connect(options[, connectListener]) llamado con {port: port, host: host} como options.

socket.connecting

Agregado en: v6.1.0

Si es true, se llamó a socket.connect(options[, connectListener]) y aún no ha terminado. Permanecerá como true hasta que el socket se conecte, luego se establece en false y se emite el evento 'connect'. Tenga en cuenta que el callback socket.connect(options[, connectListener]) es un listener para el evento 'connect'.

socket.destroy([error])

Agregado en: v0.1.90

Garantiza que no se produzca más actividad de E/S en este socket. Destruye el stream y cierra la conexión.

Consulte writable.destroy() para obtener más detalles.

socket.destroyed

  • <boolean> Indica si la conexión está destruida o no. Una vez que se destruye una conexión, no se pueden transferir más datos a través de ella.

Consulte writable.destroyed para obtener más detalles.

socket.destroySoon()

Agregado en: v0.3.4

Destruye el socket después de que se hayan escrito todos los datos. Si el evento 'finish' ya se ha emitido, el socket se destruye inmediatamente. Si el socket aún se puede escribir, llama implícitamente a socket.end().

socket.end([data[, encoding]][, callback])

Agregado en: v0.1.90

Cierra el socket a la mitad. Es decir, envía un paquete FIN. Es posible que el servidor aún envíe algunos datos.

Consulte writable.end() para obtener más detalles.

socket.localAddress

Agregado en: v0.9.6

La representación en string de la dirección IP local a la que se está conectando el cliente remoto. Por ejemplo, en un servidor que escucha en '0.0.0.0', si un cliente se conecta en '192.168.1.1', el valor de socket.localAddress sería '192.168.1.1'.

socket.localPort

Agregado en: v0.9.6

La representación numérica del puerto local. Por ejemplo, 80 o 21.

socket.localFamily

Agregado en: v18.8.0, v16.18.0

La representación en cadena de la familia IP local. 'IPv4' o 'IPv6'.

socket.pause()

Pausa la lectura de datos. Es decir, los eventos 'data' no se emitirán. Útil para reducir la velocidad de una carga.

socket.pending

Agregado en: v11.2.0, v10.16.0

Esto es true si el socket aún no está conectado, ya sea porque aún no se ha llamado a .connect() o porque todavía está en proceso de conexión (ver socket.connecting).

socket.ref()

Agregado en: v0.9.1

Opuesto a unref(), llamar a ref() en un socket previamente unref no permitirá que el programa se cierre si es el único socket que queda (el comportamiento predeterminado). Si el socket está refed, llamar a ref nuevamente no tendrá ningún efecto.

socket.remoteAddress

Agregado en: v0.5.10

La representación en cadena de la dirección IP remota. Por ejemplo, '74.125.127.100' o '2001:4860:a005::68'. El valor puede ser undefined si el socket se destruye (por ejemplo, si el cliente se desconecta).

socket.remoteFamily

Agregado en: v0.11.14

La representación en cadena de la familia IP remota. 'IPv4' o 'IPv6'. El valor puede ser undefined si el socket se destruye (por ejemplo, si el cliente se desconecta).

socket.remotePort

Agregado en: v0.5.10

La representación numérica del puerto remoto. Por ejemplo, 80 o 21. El valor puede ser undefined si el socket se destruye (por ejemplo, si el cliente se desconecta).

socket.resetAndDestroy()

Agregado en: v18.3.0, v16.17.0

Cierra la conexión TCP enviando un paquete RST y destruye el stream. Si este socket TCP está en estado de conexión, enviará un paquete RST y destruirá este socket TCP una vez que esté conectado. De lo contrario, llamará a socket.destroy con un Error ERR_SOCKET_CLOSED. Si este no es un socket TCP (por ejemplo, una tubería), llamar a este método lanzará inmediatamente un Error ERR_INVALID_HANDLE_TYPE.

socket.resume()

Reanuda la lectura después de una llamada a socket.pause().

socket.setEncoding([encoding])

Agregado en: v0.1.90

Establece la codificación para el socket como un Readable Stream. Consulte readable.setEncoding() para obtener más información.

socket.setKeepAlive([enable][, initialDelay])

[Historial]

VersiónCambios
v13.12.0, v12.17.0Se agregaron nuevos valores predeterminados para las opciones de socket TCP_KEEPCNT y TCP_KEEPINTVL.
v0.1.92Agregado en: v0.1.92

Habilita/deshabilita la funcionalidad keep-alive y, opcionalmente, establece el retraso inicial antes de que se envíe la primera sonda keepalive en un socket inactivo.

Establece initialDelay (en milisegundos) para establecer el retraso entre el último paquete de datos recibido y la primera sonda keepalive. Establecer 0 para initialDelay dejará el valor sin cambios con respecto a la configuración predeterminada (o anterior).

Habilitar la funcionalidad keep-alive establecerá las siguientes opciones de socket:

  • SO_KEEPALIVE=1
  • TCP_KEEPIDLE=initialDelay
  • TCP_KEEPCNT=10
  • TCP_KEEPINTVL=1

socket.setNoDelay([noDelay])

Agregado en: v0.1.90

Activa/desactiva el uso del algoritmo de Nagle.

Cuando se crea una conexión TCP, tendrá habilitado el algoritmo de Nagle.

El algoritmo de Nagle retrasa los datos antes de enviarlos a través de la red. Intenta optimizar el rendimiento a expensas de la latencia.

Pasar true para noDelay o no pasar un argumento desactivará el algoritmo de Nagle para el socket. Pasar false para noDelay activará el algoritmo de Nagle.

socket.setTimeout(timeout[, callback])

[Historial]

VersiónCambios
v18.0.0Pasar una callback inválida al argumento callback ahora arroja ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v0.1.90Agregado en: v0.1.90

Establece el socket para que se agote el tiempo de espera después de timeout milisegundos de inactividad en el socket. Por defecto, net.Socket no tiene un tiempo de espera.

Cuando se activa un tiempo de espera de inactividad, el socket recibirá un evento 'timeout', pero la conexión no se interrumpirá. El usuario debe llamar manualmente a socket.end() o socket.destroy() para finalizar la conexión.

js
socket.setTimeout(3000);
socket.on('timeout', () => {
  console.log('tiempo de espera del socket');
  socket.end();
});

Si timeout es 0, entonces el tiempo de espera de inactividad existente se deshabilita.

El parámetro opcional callback se agregará como un listener de una sola vez para el evento 'timeout'.

socket.timeout

Agregado en: v10.7.0

El tiempo de espera del socket en milisegundos según lo establecido por socket.setTimeout(). Es undefined si no se ha establecido un tiempo de espera.

socket.unref()

Agregado en: v0.9.1

Llamar a unref() en un socket permitirá que el programa se cierre si este es el único socket activo en el sistema de eventos. Si el socket ya está unrefed, llamar a unref() nuevamente no tendrá ningún efecto.

socket.write(data[, encoding][, callback])

Agregado en: v0.1.90

Envía datos en el socket. El segundo parámetro especifica la codificación en el caso de una cadena. El valor predeterminado es la codificación UTF8.

Devuelve true si todos los datos se vaciaron correctamente al búfer del kernel. Devuelve false si la totalidad o parte de los datos se pusieron en cola en la memoria del usuario. Se emitirá 'drain' cuando el búfer esté nuevamente libre.

El parámetro opcional callback se ejecutará cuando los datos finalmente se escriban, lo que puede no ser de inmediato.

Consulte el método write() del flujo Writable para obtener más información.

socket.readyState

Añadido en: v0.5.0

Esta propiedad representa el estado de la conexión como una cadena.

  • Si el flujo se está conectando, socket.readyState es opening.
  • Si el flujo es legible y escribible, es open.
  • Si el flujo es legible y no escribible, es readOnly.
  • Si el flujo no es legible ni escribible, es writeOnly.

net.connect()

Alias de net.createConnection().

Posibles firmas:

net.connect(options[, connectListener])

Añadido en: v0.7.0

Alias de net.createConnection(options[, connectListener]).

net.connect(path[, connectListener])

Añadido en: v0.1.90

Alias de net.createConnection(path[, connectListener]).

net.connect(port[, host][, connectListener])

Añadido en: v0.1.90

Alias de net.createConnection(port[, host][, connectListener]).

net.createConnection()

Una función de fábrica que crea un nuevo net.Socket, inicia inmediatamente la conexión con socket.connect() y luego devuelve el net.Socket que inicia la conexión.

Cuando se establece la conexión, se emitirá un evento 'connect' en el socket devuelto. El último parámetro connectListener, si se proporciona, se agregará como un detector para el evento 'connect' una vez.

Posibles firmas:

La función net.connect() es un alias de esta función.

net.createConnection(options[, connectListener])

Agregado en: v0.1.90

Para ver las opciones disponibles, consulte new net.Socket([options]) y socket.connect(options[, connectListener]).

Opciones adicionales:

El siguiente es un ejemplo de un cliente del servidor de eco descrito en la sección net.createServer():

js
import net from 'node:net';
const client = net.createConnection({ port: 8124 }, () => {
  // 'connect' listener.
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});
js
const net = require('node:net');
const client = net.createConnection({ port: 8124 }, () => {
  // 'connect' listener.
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});

Para conectarse al socket /tmp/echo.sock:

js
const client = net.createConnection({ path: '/tmp/echo.sock' });

El siguiente es un ejemplo de un cliente que utiliza la opción port y onread. En este caso, la opción onread solo se utilizará para llamar a new net.Socket([options]) y la opción port se utilizará para llamar a socket.connect(options[, connectListener]).

js
import net from 'node:net';
import { Buffer } from 'node:buffer';
net.createConnection({
  port: 8124,
  onread: {
    // Reuses a 4KiB Buffer for every read from the socket.
    buffer: Buffer.alloc(4 * 1024),
    callback: function(nread, buf) {
      // Received data is available in `buf` from 0 to `nread`.
      console.log(buf.toString('utf8', 0, nread));
    },
  },
});
js
const net = require('node:net');
net.createConnection({
  port: 8124,
  onread: {
    // Reuses a 4KiB Buffer for every read from the socket.
    buffer: Buffer.alloc(4 * 1024),
    callback: function(nread, buf) {
      // Received data is available in `buf` from 0 to `nread`.
      console.log(buf.toString('utf8', 0, nread));
    },
  },
});

net.createConnection(path[, connectListener])

Agregado en: v0.1.90

Inicia una conexión IPC.

Esta función crea un nuevo net.Socket con todas las opciones establecidas de forma predeterminada, inicia inmediatamente la conexión con socket.connect(path[, connectListener]) y luego devuelve el net.Socket que inicia la conexión.

net.createConnection(port[, host][, connectListener])

Agregado en: v0.1.90

Inicia una conexión TCP.

Esta función crea un nuevo net.Socket con todas las opciones establecidas de forma predeterminada, inicia inmediatamente la conexión con socket.connect(port[, host][, connectListener]) y luego devuelve el net.Socket que inicia la conexión.

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

[Historial]

VersiónCambios
v20.1.0, v18.17.0La opción highWaterMark ahora es compatible.
v17.7.0, v16.15.0Las opciones noDelay, keepAlive y keepAliveInitialDelay ahora son compatibles.
v0.5.0Añadido en: v0.5.0
  • options <Objeto>

    • allowHalfOpen <booleano> Si se establece en false, entonces el socket finalizará automáticamente el lado de escritura cuando finalice el lado de lectura. Predeterminado: false.
    • highWaterMark <número> Opcionalmente, anula readableHighWaterMark y writableHighWaterMark de todos los net.Sockets. Predeterminado: Ver stream.getDefaultHighWaterMark().
    • keepAlive <booleano> Si se establece en true, habilita la funcionalidad keep-alive en el socket inmediatamente después de que se recibe una nueva conexión entrante, de forma similar a lo que se hace en socket.setKeepAlive(). Predeterminado: false.
    • keepAliveInitialDelay <número> Si se establece en un número positivo, establece el retraso inicial antes de que se envíe la primera sonda keepalive en un socket inactivo. Predeterminado: 0.
    • noDelay <booleano> Si se establece en true, deshabilita el uso del algoritmo de Nagle inmediatamente después de que se recibe una nueva conexión entrante. Predeterminado: false.
    • pauseOnConnect <booleano> Indica si el socket debe pausarse en las conexiones entrantes. Predeterminado: false.
    • blockList <net.BlockList> blockList se puede utilizar para deshabilitar el acceso entrante a direcciones IP, rangos de IP o subredes IP específicas. Esto no funciona si el servidor está detrás de un proxy inverso, NAT, etc. porque la dirección comprobada con la lista de bloqueo es la dirección del proxy o la especificada por el NAT.
  • connectionListener <Función> Se establece automáticamente como un listener para el evento 'connection'.

  • Devuelve: <net.Server>

Crea un nuevo servidor TCP o IPC.

Si allowHalfOpen está establecido en true, cuando el otro extremo del socket señala el final de la transmisión, el servidor solo enviará de vuelta el final de la transmisión cuando se llame explícitamente a socket.end(). Por ejemplo, en el contexto de TCP, cuando se recibe un paquete FIN, se envía un paquete FIN de vuelta solo cuando se llama explícitamente a socket.end(). Hasta entonces, la conexión está medio cerrada (no legible pero aún grabable). Ver el evento 'end' y RFC 1122 (sección 4.2.2.13) para más información.

Si pauseOnConnect está establecido en true, entonces el socket asociado con cada conexión entrante se pausará y no se leerán datos de su identificador. Esto permite que las conexiones se pasen entre procesos sin que el proceso original lea ningún dato. Para comenzar a leer datos de un socket pausado, llama a socket.resume().

El servidor puede ser un servidor TCP o un servidor IPC, dependiendo de a qué listen() lo haga.

Aquí hay un ejemplo de un servidor de eco TCP que escucha las conexiones en el puerto 8124:

js
import net from 'node:net';
const server = net.createServer((c) => {
  // 'connection' listener.
  console.log('client connected');
  c.on('end', () => {
    console.log('client disconnected');
  });
  c.write('hello\r\n');
  c.pipe(c);
});
server.on('error', (err) => {
  throw err;
});
server.listen(8124, () => {
  console.log('server bound');
});
js
const net = require('node:net');
const server = net.createServer((c) => {
  // 'connection' listener.
  console.log('client connected');
  c.on('end', () => {
    console.log('client disconnected');
  });
  c.write('hello\r\n');
  c.pipe(c);
});
server.on('error', (err) => {
  throw err;
});
server.listen(8124, () => {
  console.log('server bound');
});

Pruébalo usando telnet:

bash
telnet localhost 8124

Para escuchar en el socket /tmp/echo.sock:

js
server.listen('/tmp/echo.sock', () => {
  console.log('server bound');
});

Usa nc para conectarte a un servidor de socket de dominio Unix:

bash
nc -U /tmp/echo.sock

net.getDefaultAutoSelectFamily()

Agregado en: v19.4.0

Obtiene el valor predeterminado actual de la opción autoSelectFamily de socket.connect(options). El valor predeterminado inicial es true, a menos que se proporcione la opción de línea de comandos --no-network-family-autoselection.

  • Devuelve: <boolean> El valor predeterminado actual de la opción autoSelectFamily.

net.setDefaultAutoSelectFamily(value)

Agregado en: v19.4.0

Establece el valor predeterminado de la opción autoSelectFamily de socket.connect(options).

  • value <boolean> El nuevo valor predeterminado. El valor predeterminado inicial es true, a menos que se proporcione la opción de línea de comandos --no-network-family-autoselection.

net.getDefaultAutoSelectFamilyAttemptTimeout()

Agregado en: v19.8.0, v18.18.0

Obtiene el valor predeterminado actual de la opción autoSelectFamilyAttemptTimeout de socket.connect(options). El valor predeterminado inicial es 250 o el valor especificado a través de la opción de línea de comandos --network-family-autoselection-attempt-timeout.

  • Devuelve: <number> El valor predeterminado actual de la opción autoSelectFamilyAttemptTimeout.

net.setDefaultAutoSelectFamilyAttemptTimeout(value)

Agregado en: v19.8.0, v18.18.0

Establece el valor predeterminado de la opción autoSelectFamilyAttemptTimeout de socket.connect(options).

  • value <number> El nuevo valor predeterminado, que debe ser un número positivo. Si el número es menor que 10, se utiliza el valor 10 en su lugar. El valor predeterminado inicial es 250 o el valor especificado a través de la opción de línea de comandos --network-family-autoselection-attempt-timeout.

net.isIP(input)

Agregado en: v0.3.0

Regresa 6 si input es una dirección IPv6. Regresa 4 si input es una dirección IPv4 en notación decimal punteada sin ceros iniciales. De lo contrario, regresa 0.

js
net.isIP('::1'); // regresa 6
net.isIP('127.0.0.1'); // regresa 4
net.isIP('127.000.000.001'); // regresa 0
net.isIP('127.0.0.1/24'); // regresa 0
net.isIP('fhqwhgads'); // regresa 0

net.isIPv4(input)

Agregado en: v0.3.0

Regresa true si input es una dirección IPv4 en notación decimal punteada sin ceros iniciales. De lo contrario, regresa false.

js
net.isIPv4('127.0.0.1'); // regresa true
net.isIPv4('127.000.000.001'); // regresa false
net.isIPv4('127.0.0.1/24'); // regresa false
net.isIPv4('fhqwhgads'); // regresa false

net.isIPv6(input)

Agregado en: v0.3.0

Regresa true si input es una dirección IPv6. De lo contrario, regresa false.

js
net.isIPv6('::1'); // regresa true
net.isIPv6('fhqwhgads'); // regresa false