Skip to content

Net

[Stabile: 2 - Stabile]

Stabile: 2 Stabilità: 2 - Stabile

Codice Sorgente: lib/net.js

Il modulo node:net fornisce un'API di rete asincrona per la creazione di server TCP o IPC basati su stream (net.createServer()) e client (net.createConnection()).

È possibile accedervi utilizzando:

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

Supporto IPC

[Cronologia]

VersioneModifiche
v20.8.0Supporto per il binding a un percorso socket di dominio Unix astratto come \0abstract. Possiamo associare '\0' per Node.js \< v20.4.0.

Il modulo node:net supporta IPC con named pipe su Windows e socket di dominio Unix su altri sistemi operativi.

Identificazione dei percorsi per le connessioni IPC

net.connect(), net.createConnection(), server.listen() e socket.connect() accettano un parametro path per identificare gli endpoint IPC.

Su Unix, il dominio locale è anche noto come dominio Unix. Il percorso è un percorso del file system. Genererà un errore quando la lunghezza del percorso è maggiore della lunghezza di sizeof(sockaddr_un.sun_path). I valori tipici sono 107 byte su Linux e 103 byte su macOS. Se un'astrazione API di Node.js crea il socket di dominio Unix, disconnetterà anche il socket di dominio Unix. Ad esempio, net.createServer() potrebbe creare un socket di dominio Unix e server.close() lo disconnetterà. Ma se un utente crea il socket di dominio Unix al di fuori di queste astrazioni, l'utente dovrà rimuoverlo. Lo stesso vale quando un'API Node.js crea un socket di dominio Unix, ma il programma si blocca. In breve, un socket di dominio Unix sarà visibile nel file system e persisterà fino alla disconnessione. Su Linux, è possibile utilizzare un socket astratto Unix aggiungendo \0 all'inizio del percorso, come \0abstract. Il percorso del socket astratto Unix non è visibile nel file system e scompare automaticamente quando tutti i riferimenti aperti al socket vengono chiusi.

Su Windows, il dominio locale viene implementato utilizzando una named pipe. Il percorso deve fare riferimento a una voce in \\?\pipe\ o \\.\pipe\. Sono consentiti tutti i caratteri, ma quest'ultimo potrebbe elaborare alcuni nomi di pipe, come la risoluzione delle sequenze ... Nonostante l'aspetto, lo spazio dei nomi della pipe è piatto. Le pipe non persistono. Vengono rimosse quando l'ultimo riferimento a esse viene chiuso. A differenza dei socket di dominio Unix, Windows chiuderà e rimuoverà la pipe quando il processo proprietario termina.

L'escape delle stringhe JavaScript richiede che i percorsi vengano specificati con un escape di backslash aggiuntivo, come ad esempio:

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

Classe: net.BlockList

Aggiunto in: v15.0.0, v14.18.0

L'oggetto BlockList può essere utilizzato con alcune API di rete per specificare regole per la disabilitazione dell'accesso in entrata o in uscita a indirizzi IP, intervalli IP o sottoreti IP specifiche.

blockList.addAddress(address[, type])

Aggiunto in: v15.0.0, v14.18.0

Aggiunge una regola per bloccare l'indirizzo IP specificato.

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

Aggiunto in: v15.0.0, v14.18.0

Aggiunge una regola per bloccare un intervallo di indirizzi IP da start (incluso) a end (incluso).

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

Aggiunto in: v15.0.0, v14.18.0

  • net <string> | <net.SocketAddress> L'indirizzo di rete IPv4 o IPv6.
  • prefix <number> Il numero di bit del prefisso CIDR. Per IPv4, questo deve essere un valore compreso tra 0 e 32. Per IPv6, questo deve essere compreso tra 0 e 128.
  • type <string> Sia 'ipv4' che 'ipv6'. Predefinito: 'ipv4'.

Aggiunge una regola per bloccare un intervallo di indirizzi IP specificato come maschera di sottorete.

blockList.check(address[, type])

Aggiunto in: v15.0.0, v14.18.0

Restituisce true se l'indirizzo IP specificato corrisponde a una qualsiasi delle regole aggiunte alla 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')) // Stampa: true
console.log(blockList.check('10.0.0.3')) // Stampa: true
console.log(blockList.check('222.111.111.222')) // Stampa: false

// La notazione IPv6 per gli indirizzi IPv4 funziona:
console.log(blockList.check('::ffff:7b7b:7b7b', 'ipv6')) // Stampa: true
console.log(blockList.check('::ffff:123.123.123.123', 'ipv6')) // Stampa: true

blockList.rules

Aggiunto in: v15.0.0, v14.18.0

L'elenco delle regole aggiunte alla lista di blocco.

BlockList.isBlockList(value)

Aggiunto in: v23.4.0

  • value <qualsiasi> Qualsiasi valore JS
  • Restituisce true se value è un net.BlockList.

Classe: net.SocketAddress

Aggiunto in: v15.14.0, v14.18.0

new net.SocketAddress([options])

Aggiunto in: v15.14.0, v14.18.0

  • options <Oggetto>
    • address <stringa> L'indirizzo di rete come stringa IPv4 o IPv6. Predefinito: '127.0.0.1' se family è 'ipv4'; '::' se family è 'ipv6'.
    • family <stringa> Uno tra 'ipv4' o 'ipv6'. Predefinito: 'ipv4'.
    • flowlabel <numero> Un'etichetta di flusso IPv6 usata solo se family è 'ipv6'.
    • port <numero> Una porta IP.

socketaddress.address

Aggiunto in: v15.14.0, v14.18.0

socketaddress.family

Aggiunto in: v15.14.0, v14.18.0

socketaddress.flowlabel

Aggiunto in: v15.14.0, v14.18.0

socketaddress.port

Aggiunto in: v15.14.0, v14.18.0

SocketAddress.parse(input)

Aggiunto in: v23.4.0

  • input <stringa> Una stringa di input contenente un indirizzo IP e una porta opzionale, ad es. 123.1.2.3:1234 o [1::1]:1234.
  • Restituisce: <net.SocketAddress> Restituisce un SocketAddress se l'analisi è riuscita. Altrimenti restituisce undefined.

Classe: net.Server

Aggiunto in: v0.1.90

Questa classe viene utilizzata per creare un server TCP o IPC.

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

net.Server è un EventEmitter con i seguenti eventi:

Evento: 'close'

Aggiunto in: v0.5.0

Emesso quando il server si chiude. Se esistono connessioni, questo evento non viene emesso finché tutte le connessioni non vengono terminate.

Evento: 'connection'

Aggiunto in: v0.1.90

Emesso quando viene effettuata una nuova connessione. socket è un'istanza di net.Socket.

Evento: 'error'

Aggiunto in: v0.1.90

Emesso quando si verifica un errore. A differenza di net.Socket, l'evento 'close' non verrà emesso direttamente dopo questo evento a meno che non venga chiamato manualmente server.close(). Consulta l'esempio nella discussione di server.listen().

Evento: 'listening'

Aggiunto in: v0.1.90

Emesso quando il server è stato associato dopo aver chiamato server.listen().

Evento: 'drop'

Aggiunto in: v18.6.0, v16.17.0

Quando il numero di connessioni raggiunge la soglia di server.maxConnections, il server rilascerà nuove connessioni ed emetterà invece l'evento 'drop'. Se si tratta di un server TCP, l'argomento è il seguente, altrimenti l'argomento è undefined.

  • data <Object> L'argomento passato al listener dell'evento.

server.address()

[Cronologia]

VersioneModifiche
v18.4.0La proprietà family ora restituisce una stringa anziché un numero.
v18.0.0La proprietà family ora restituisce un numero anziché una stringa.
v0.1.90Aggiunto in: v0.1.90

Restituisce l'address associato, il nome della family dell'indirizzo e la porta del server come riportato dal sistema operativo se in ascolto su un socket IP (utile per trovare quale porta è stata assegnata quando si ottiene un indirizzo assegnato dal sistema operativo): { port: 12346, family: 'IPv4', address: '127.0.0.1' }.

Per un server in ascolto su una pipe o un socket di dominio Unix, il nome viene restituito come una stringa.

js
const server = net
  .createServer(socket => {
    socket.end('arrivederci\n')
  })
  .on('error', err => {
    // Gestisci gli errori qui.
    throw err
  })

// Ottieni una porta inutilizzata arbitraria.
server.listen(() => {
  console.log('server aperto su', server.address())
})

server.address() restituisce null prima che l'evento 'listening' sia stato emesso o dopo aver chiamato server.close().

server.close([callback])

Aggiunto in: v0.1.90

Interrompe l'accettazione di nuove connessioni da parte del server e mantiene le connessioni esistenti. Questa funzione è asincrona, il server viene finalmente chiuso quando tutte le connessioni sono terminate e il server emette un evento 'close'. La callback opzionale verrà chiamata una volta che si verifica l'evento 'close'. A differenza di quell'evento, verrà chiamata con un Error come unico argomento se il server non era aperto quando è stato chiuso.

server[Symbol.asyncDispose]()

Aggiunto in: v20.5.0, v18.18.0

[Stabile: 1 - Sperimentale]

Stabile: 1 Stabilità: 1 - Sperimentale

Chiama server.close() e restituisce una promise che viene soddisfatta quando il server è stato chiuso.

server.getConnections(callback)

Aggiunto in: v0.9.7

Ottiene in modo asincrono il numero di connessioni concorrenti sul server. Funziona quando i socket sono stati inviati a fork.

Il callback dovrebbe accettare due argomenti err e count.

server.listen()

Avvia un server in ascolto di connessioni. Un net.Server può essere un server TCP o IPC a seconda di ciò che ascolta.

Possibili firme:

Questa funzione è asincrona. Quando il server inizia l'ascolto, verrà emesso l'evento 'listening'. L'ultimo parametro callback verrà aggiunto come listener per l'evento 'listening'.

Tutti i metodi listen() possono accettare un parametro backlog per specificare la lunghezza massima della coda di connessioni in sospeso. La lunghezza effettiva sarà determinata dal sistema operativo tramite le impostazioni sysctl come tcp_max_syn_backlog e somaxconn su Linux. Il valore predefinito di questo parametro è 511 (non 512).

Tutti i net.Socket sono impostati su SO_REUSEADDR (vedere socket(7) per i dettagli).

Il metodo server.listen() può essere chiamato di nuovo se e solo se si è verificato un errore durante la prima chiamata a server.listen() o è stato chiamato server.close(). In caso contrario, verrà generato un errore ERR_SERVER_ALREADY_LISTEN.

Uno degli errori più comuni che si verificano durante l'ascolto è EADDRINUSE. Questo accade quando un altro server è già in ascolto sulla porta/percorso/handle richiesta. Un modo per gestire ciò potrebbe essere riprovare dopo un certo periodo di tempo:

js
server.on('error', e => {
  if (e.code === 'EADDRINUSE') {
    console.error('Indirizzo in uso, riprovo...')
    setTimeout(() => {
      server.close()
      server.listen(PORT, HOST)
    }, 1000)
  }
})

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

Aggiunto in: v0.5.10

Avvia un server in ascolto di connessioni su un dato handle che è già stato associato a una porta, un socket di dominio Unix o una named pipe di Windows.

L'oggetto handle può essere un server, un socket (qualsiasi cosa con un membro _handle sottostante) o un oggetto con un membro fd che è un descrittore di file valido.

L'ascolto su un descrittore di file non è supportato in Windows.

server.listen(options[, callback])

[Cronologia]

VersioneModifiche
v23.1.0L'opzione reusePort è supportata.
v15.6.0È stato aggiunto il supporto per AbortSignal.
v11.4.0L'opzione ipv6Only è supportata.
v0.11.14Aggiunto in: v0.11.14
  • options <Object> Richiesto. Supporta le seguenti proprietà:

    • backlog <number> Parametro comune delle funzioni server.listen().
    • exclusive <boolean> Predefinito: false
    • host <string>
    • ipv6Only <boolean> Per i server TCP, impostare ipv6Only su true disabiliterà il supporto dual-stack, ovvero l'associazione all'host :: non farà sì che 0.0.0.0 venga associato. Predefinito: false.
    • reusePort <boolean> Per i server TCP, impostare reusePort su true consente a più socket sullo stesso host di associarsi alla stessa porta. Le connessioni in entrata vengono distribuite dal sistema operativo ai socket in ascolto. Questa opzione è disponibile solo su alcune piattaforme, come Linux 3.9+, DragonFlyBSD 3.6+, FreeBSD 12.0+, Solaris 11.4 e AIX 7.2.5+. Predefinito: false.
    • path <string> Verrà ignorato se viene specificata la port. Vedi Identificazione dei percorsi per le connessioni IPC.
    • port <number>
    • readableAll <boolean> Per i server IPC, rende la pipe leggibile per tutti gli utenti. Predefinito: false.
    • signal <AbortSignal> Un AbortSignal che può essere utilizzato per chiudere un server in ascolto.
    • writableAll <boolean> Per i server IPC, rende la pipe scrivibile per tutti gli utenti. Predefinito: false.
  • callback <Function> funzioni.

  • Restituisce: <net.Server>

Se viene specificata port, si comporta allo stesso modo di server.listen([port[, host[, backlog]]][, callback]). Altrimenti, se viene specificato path, si comporta allo stesso modo di server.listen(path[, backlog][, callback]). Se nessuno di essi viene specificato, verrà generato un errore.

Se exclusive è false (predefinito), i worker del cluster utilizzeranno lo stesso handle sottostante, consentendo la condivisione dei compiti di gestione delle connessioni. Quando exclusive è true, l'handle non è condiviso e il tentativo di condivisione della porta comporta un errore. Di seguito viene mostrato un esempio che ascolta su una porta esclusiva.

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

Quando exclusive è true e l'handle sottostante è condiviso, è possibile che diversi worker interroghino un handle con backlog diversi. In questo caso, verrà utilizzato il primo backlog passato al processo master.

L'avvio di un server IPC come root potrebbe rendere inaccessibile il percorso del server per gli utenti senza privilegi. L'utilizzo di readableAll e writableAll renderà il server accessibile a tutti gli utenti.

Se l'opzione signal è abilitata, chiamare .abort() sul corrispondente AbortController è simile alla chiamata di .close() sul server:

js
const controller = new AbortController()
server.listen({
  host: 'localhost',
  port: 80,
  signal: controller.signal,
})
// In seguito, quando si desidera chiudere il server.
controller.abort()

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

Aggiunto in: v0.1.90

Avvia un server IPC in ascolto delle connessioni sul path specificato.

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

Aggiunto in: v0.1.90

Avvia un server TCP in ascolto delle connessioni sulla port e host specificati.

Se port viene omesso o è 0, il sistema operativo assegnerà una porta libera arbitraria, che può essere recuperata utilizzando server.address().port dopo che l'evento 'listening' è stato emesso.

Se host viene omesso, il server accetterà le connessioni sull'indirizzo IPv6 non specificato (::) quando IPv6 è disponibile, o sull'indirizzo IPv4 non specificato (0.0.0.0) altrimenti.

Nella maggior parte dei sistemi operativi, l'ascolto sull'indirizzo IPv6 non specificato (::) può far sì che net.Server si metta in ascolto anche sull'indirizzo IPv4 non specificato (0.0.0.0).

server.listening

Aggiunto in: v5.7.0

  • <boolean> Indica se il server è in ascolto o meno per le connessioni.

server.maxConnections

[Cronologia]

VersioneModifiche
v21.0.0Impostare maxConnections a 0 interrompe tutte le connessioni in entrata. In precedenza, veniva interpretato come Infinity.
v0.2.0Aggiunto in: v0.2.0

Quando il numero di connessioni raggiunge la soglia server.maxConnections:

Non è raccomandato utilizzare questa opzione una volta che un socket è stato inviato a un figlio con child_process.fork().

server.dropMaxConnection

Aggiunto in: v23.1.0

Imposta questa proprietà su true per iniziare a chiudere le connessioni una volta che il numero di connessioni raggiunge la soglia [server.maxConnections][]. Questa impostazione è efficace solo in modalità cluster.

server.ref()

Aggiunto in: v0.9.1

L'opposto di unref(), chiamare ref() su un server precedentemente unref non permetterà al programma di uscire se è l'unico server rimasto (il comportamento predefinito). Se il server è ref, chiamare di nuovo ref() non avrà alcun effetto.

server.unref()

Aggiunto in: v0.9.1

Chiamare unref() su un server permetterà al programma di uscire se questo è l'unico server attivo nel sistema di eventi. Se il server è già unref, chiamare di nuovo unref() non avrà alcun effetto.

Classe: net.Socket

Aggiunto in: v0.3.4

Questa classe è un'astrazione di un socket TCP o di un endpoint IPC in streaming (utilizza named pipe su Windows e socket di dominio Unix altrimenti). È anche un EventEmitter.

Un net.Socket può essere creato dall'utente e utilizzato direttamente per interagire con un server. Ad esempio, viene restituito da net.createConnection(), quindi l'utente può usarlo per comunicare con il server.

Può anche essere creato da Node.js e passato all'utente quando viene ricevuta una connessione. Ad esempio, viene passato agli ascoltatori di un evento 'connection' emesso su un net.Server, quindi l'utente può usarlo per interagire con il client.

new net.Socket([options])

[Cronologia]

VersioneModifiche
v15.14.0Aggiunto il supporto per AbortSignal.
v12.10.0Aggiunta l'opzione onread.
v0.3.4Aggiunto in: v0.3.4
  • options <Oggetto> Le opzioni disponibili sono:

    • allowHalfOpen <booleano> Se impostato su false, il socket terminerà automaticamente il lato scrivibile quando termina il lato leggibile. Vedere net.createServer() e l'evento 'end' per i dettagli. Predefinito: false.
    • fd <numero> Se specificato, esegue il wrapping attorno a un socket esistente con il descrittore di file fornito, altrimenti verrà creato un nuovo socket.
    • onread <Oggetto> Se specificato, i dati in entrata vengono archiviati in un singolo buffer e passati al callback fornito quando i dati arrivano sul socket. Ciò farà sì che la funzionalità di streaming non fornisca alcun dato. Il socket emetterà eventi come 'error', 'end' e 'close' come di consueto. Anche metodi come pause() e resume() si comporteranno come previsto.
    • buffer <Buffer> | <Uint8Array> | <Funzione> Un blocco di memoria riutilizzabile da utilizzare per l'archiviazione dei dati in entrata o una funzione che restituisce tale blocco.
    • callback <Funzione> Questa funzione viene chiamata per ogni blocco di dati in entrata. Le vengono passati due argomenti: il numero di byte scritti nel buffer e un riferimento al buffer. Restituire false da questa funzione per pause() implicitamente il socket. Questa funzione verrà eseguita nel contesto globale.
    • readable <booleano> Consente le letture sul socket quando viene passato un fd, altrimenti viene ignorato. Predefinito: false.
    • signal <AbortSignal> Un segnale di interruzione che può essere utilizzato per distruggere il socket.
    • writable <booleano> Consente le scritture sul socket quando viene passato un fd, altrimenti viene ignorato. Predefinito: false.
  • Restituisce: <net.Socket>

Crea un nuovo oggetto socket.

Il socket appena creato può essere un socket TCP o un endpoint IPC di streaming, a seconda di cosa si connect() a.

Evento: 'close'

Aggiunto in: v0.1.90

  • hadError <boolean> true se il socket aveva un errore di trasmissione.

Emesso una volta che il socket è completamente chiuso. L'argomento hadError è un valore booleano che indica se il socket è stato chiuso a causa di un errore di trasmissione.

Evento: 'connect'

Aggiunto in: v0.1.90

Emesso quando una connessione socket è stabilita con successo. Vedere net.createConnection().

Evento: 'connectionAttempt'

Aggiunto in: v21.6.0, v20.12.0

  • ip <string> L'IP al quale il socket sta tentando di connettersi.
  • port <number> La porta alla quale il socket sta tentando di connettersi.
  • family <number> La famiglia dell'IP. Può essere 6 per IPv6 o 4 per IPv4.

Emesso quando viene avviato un nuovo tentativo di connessione. Questo può essere emesso più volte se l'algoritmo di selezione automatica della famiglia è abilitato in socket.connect(options).

Evento: 'connectionAttemptFailed'

Aggiunto in: v21.6.0, v20.12.0

  • ip <string> L'IP al quale il socket ha tentato di connettersi.
  • port <number> La porta alla quale il socket ha tentato di connettersi.
  • family <number> La famiglia dell'IP. Può essere 6 per IPv6 o 4 per IPv4.
  • error <Error> L'errore associato al fallimento.

Emesso quando un tentativo di connessione è fallito. Questo può essere emesso più volte se l'algoritmo di selezione automatica della famiglia è abilitato in socket.connect(options).

Evento: 'connectionAttemptTimeout'

Aggiunto in: v21.6.0, v20.12.0

  • ip <string> L'IP a cui il socket ha tentato di connettersi.
  • port <number> La porta a cui il socket ha tentato di connettersi.
  • family <number> La famiglia dell'IP. Può essere 6 per IPv6 o 4 per IPv4.

Emesso quando un tentativo di connessione è scaduto. Questo evento viene emesso (e può essere emesso più volte) solo se l'algoritmo di selezione automatica della famiglia è abilitato in socket.connect(options).

Evento: 'data'

Aggiunto in: v0.1.90

Emesso quando vengono ricevuti dati. L'argomento data sarà un Buffer o una String. La codifica dei dati è impostata da socket.setEncoding().

I dati andranno persi se non è presente un listener quando un Socket emette un evento 'data'.

Evento: 'drain'

Aggiunto in: v0.1.90

Emesso quando il buffer di scrittura diventa vuoto. Può essere utilizzato per limitare gli upload.

Vedi anche: i valori di ritorno di socket.write().

Evento: 'end'

Aggiunto in: v0.1.90

Emesso quando l'altra estremità del socket segnala la fine della trasmissione, ponendo così fine al lato leggibile del socket.

Per impostazione predefinita (allowHalfOpen è false) il socket invierà un pacchetto di fine trasmissione e distruggerà il suo descrittore di file una volta che avrà scritto la sua coda di scrittura in sospeso. Tuttavia, se allowHalfOpen è impostato su true, il socket non eseguirà automaticamente end() sul suo lato scrivibile, consentendo all'utente di scrivere quantità arbitrarie di dati. L'utente deve chiamare end() esplicitamente per chiudere la connessione (cioè inviando un pacchetto FIN).

Evento: 'error'

Aggiunto in: v0.1.90

Emesso quando si verifica un errore. L'evento 'close' sarà chiamato immediatamente dopo questo evento.

Evento: 'lookup'

[Cronologia]

VersioneModifiche
v5.10.0Il parametro host è ora supportato.
v0.11.3Aggiunto in: v0.11.3

Emesso dopo la risoluzione del nome host ma prima della connessione. Non applicabile ai socket Unix.

Evento: 'ready'

Aggiunto in: v9.11.0

Emesso quando un socket è pronto per essere utilizzato.

Attivato immediatamente dopo 'connect'.

Evento: 'timeout'

Aggiunto in: v0.1.90

Emesso se il socket va in timeout a causa dell'inattività. Questo serve solo a notificare che il socket è stato inattivo. L'utente deve chiudere manualmente la connessione.

Vedi anche: socket.setTimeout().

socket.address()

[Cronologia]

VersioneModifiche
v18.4.0La proprietà family ora restituisce una stringa invece di un numero.
v18.0.0La proprietà family ora restituisce un numero invece di una stringa.
v0.1.90Aggiunto in: v0.1.90

Restituisce l'address associato, il nome della family dell'indirizzo e la port del socket come riportato dal sistema operativo: { port: 12346, family: 'IPv4', address: '127.0.0.1' }

socket.autoSelectFamilyAttemptedAddresses

Aggiunto in: v19.4.0, v18.18.0

Questa proprietà è presente solo se l'algoritmo di autoselezione della famiglia è abilitato in socket.connect(options) ed è un array degli indirizzi che sono stati tentati.

Ogni indirizzo è una stringa nella forma $IP:$PORT. Se la connessione ha avuto successo, l'ultimo indirizzo è quello a cui il socket è attualmente connesso.

socket.bufferSize

Aggiunto in: v0.3.8

Deprecato da: v14.6.0

[Stabile: 0 - Deprecato]

Stabile: 0 Stabilità: 0 - Deprecato: Utilizzare invece writable.writableLength.

Questa proprietà mostra il numero di caratteri memorizzati nel buffer per la scrittura. Il buffer può contenere stringhe la cui lunghezza dopo la codifica non è ancora nota. Quindi questo numero è solo un'approssimazione del numero di byte nel buffer.

net.Socket ha la proprietà che socket.write() funziona sempre. Questo per aiutare gli utenti a iniziare rapidamente. Il computer non può sempre tenere il passo con la quantità di dati che vengono scritti su un socket. La connessione di rete potrebbe essere semplicemente troppo lenta. Node.js accoderà internamente i dati scritti su un socket e li invierà via cavo quando possibile.

La conseguenza di questo buffering interno è che la memoria potrebbe crescere. Gli utenti che riscontrano bufferSize grandi o in crescita dovrebbero tentare di "limitare" i flussi di dati nel loro programma con socket.pause() e socket.resume().

socket.bytesRead

Aggiunto in: v0.5.3

La quantità di byte ricevuti.

socket.bytesWritten

Aggiunto in: v0.5.3

La quantità di byte inviati.

socket.connect()

Avvia una connessione su un socket specificato.

Possibili firme:

Questa funzione è asincrona. Quando la connessione è stabilita, viene emesso l'evento 'connect'. Se si verifica un problema durante la connessione, invece di un evento 'connect', viene emesso un evento 'error' con l'errore passato all'ascoltatore 'error'. L'ultimo parametro connectListener, se fornito, verrà aggiunto come ascoltatore per l'evento 'connect' una sola volta.

Questa funzione dovrebbe essere utilizzata solo per riconnettere un socket dopo che è stato emesso 'close' o altrimenti potrebbe portare a un comportamento indefinito.

socket.connect(options[, connectListener])

[Cronologia]

VersioneModifiche
v19.4.0Il valore predefinito per l'opzione autoSelectFamily può essere modificato a runtime utilizzando setDefaultAutoSelectFamily o tramite l'opzione della riga di comando --enable-network-family-autoselection.
v20.0.0, v18.18.0Il valore predefinito per l'opzione autoSelectFamily è ora true. Il flag CLI --enable-network-family-autoselection è stato rinominato in --network-family-autoselection. Il vecchio nome è ora un alias, ma è sconsigliato.
v19.3.0, v18.13.0Aggiunta l'opzione autoSelectFamily.
v17.7.0, v16.15.0Le opzioni noDelay, keepAlive e keepAliveInitialDelay sono ora supportate.
v6.0.0L'opzione hints ora è impostata per default a 0 in tutti i casi. In precedenza, in assenza dell'opzione family era impostata per default a `dns.ADDRCONFIG
v5.11.0L'opzione hints è ora supportata.
v0.1.90Aggiunto in: v0.1.90

Avvia una connessione su un socket specificato. Normalmente questo metodo non è necessario, il socket dovrebbe essere creato e aperto con net.createConnection(). Utilizzare questo solo quando si implementa un socket personalizzato.

Per le connessioni TCP, le options disponibili sono:

  • autoSelectFamily <boolean>: Se impostato su true, abilita un algoritmo di auto-rilevamento della famiglia che implementa liberamente la sezione 5 della RFC 8305. L'opzione all passata a lookup è impostata su true e i socket tentano di connettersi a tutti gli indirizzi IPv6 e IPv4 ottenuti, in sequenza, fino a quando non viene stabilita una connessione. Viene tentato per primo il primo indirizzo AAAA restituito, quindi il primo indirizzo A restituito, quindi il secondo indirizzo AAAA restituito e così via. A ciascun tentativo di connessione (ma non l'ultimo) viene assegnato il tempo specificato dall'opzione autoSelectFamilyAttemptTimeout prima che scada e venga provato l'indirizzo successivo. Ignorato se l'opzione family non è 0 o se è impostato localAddress. Gli errori di connessione non vengono emessi se almeno una connessione riesce. Se tutti i tentativi di connessione falliscono, viene emesso un singolo AggregateError con tutti i tentativi non riusciti. Default: net.getDefaultAutoSelectFamily().
  • autoSelectFamilyAttemptTimeout <number>: La quantità di tempo in millisecondi da attendere prima che un tentativo di connessione termini prima di provare l'indirizzo successivo quando si utilizza l'opzione autoSelectFamily. Se impostato su un numero intero positivo inferiore a 10, verrà utilizzato invece il valore 10. Default: net.getDefaultAutoSelectFamilyAttemptTimeout().
  • family <number>: Versione dello stack IP. Deve essere 4, 6 o 0. Il valore 0 indica che sono consentiti sia gli indirizzi IPv4 che IPv6. Default: 0.
  • hints <number> Opzionale dns.lookup() suggerimenti.
  • host <string> Host a cui il socket deve connettersi. Default: 'localhost'.
  • keepAlive <boolean> Se impostato su true, abilita la funzionalità keep-alive sul socket immediatamente dopo che la connessione è stabilita, in modo simile a quanto fatto in socket.setKeepAlive(). Default: false.
  • keepAliveInitialDelay <number> Se impostato su un numero positivo, imposta il ritardo iniziale prima che la prima sonda keepalive venga inviata su un socket inattivo. Default: 0.
  • localAddress <string> Indirizzo locale da cui il socket deve connettersi.
  • localPort <number> Porta locale da cui il socket deve connettersi.
  • lookup <Function> Funzione di ricerca personalizzata. Default: dns.lookup().
  • noDelay <boolean> Se impostato su true, disabilita l'uso dell'algoritmo di Nagle immediatamente dopo che il socket è stabilito. Default: false.
  • port <number> Obbligatorio. Porta a cui il socket deve connettersi.
  • blockList <net.BlockList> blockList può essere utilizzato per disabilitare l'accesso in uscita a specifici indirizzi IP, intervalli IP o sottoreti IP.

Per le connessioni IPC, le options disponibili sono:

socket.connect(path[, connectListener])

Avvia una connessione IPC sul socket specificato.

Alias di socket.connect(options[, connectListener]) chiamato con { path: path } come options.

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

Aggiunto in: v0.1.90

Avvia una connessione TCP sul socket specificato.

Alias di socket.connect(options[, connectListener]) chiamato con {port: port, host: host} come options.

socket.connecting

Aggiunto in: v6.1.0

Se true, socket.connect(options[, connectListener]) è stato chiamato e non è ancora terminato. Rimarrà true finché il socket non si connetterà, quindi viene impostato su false e viene emesso l'evento 'connect'. Si noti che la callback socket.connect(options[, connectListener]) è un listener per l'evento 'connect'.

socket.destroy([error])

Aggiunto in: v0.1.90

Assicura che non si verifichino più attività I/O su questo socket. Distrugge lo stream e chiude la connessione.

Vedi writable.destroy() per ulteriori dettagli.

socket.destroyed

  • <boolean> Indica se la connessione è distrutta o meno. Una volta distrutta una connessione, non è possibile trasferire ulteriori dati utilizzandola.

Vedi writable.destroyed per ulteriori dettagli.

socket.destroySoon()

Aggiunto in: v0.3.4

Distrugge il socket dopo che tutti i dati sono stati scritti. Se l'evento 'finish' è già stato emesso, il socket viene distrutto immediatamente. Se il socket è ancora scrivibile, chiama implicitamente socket.end().

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

Aggiunto in: v0.1.90

Chiude a metà il socket. Ovvero, invia un pacchetto FIN. È possibile che il server invii ancora alcuni dati.

Vedi writable.end() per ulteriori dettagli.

socket.localAddress

Aggiunto in: v0.9.6

La rappresentazione stringa dell'indirizzo IP locale su cui si sta connettendo il client remoto. Ad esempio, in un server in ascolto su '0.0.0.0', se un client si connette su '192.168.1.1', il valore di socket.localAddress sarebbe '192.168.1.1'.

socket.localPort

Aggiunto in: v0.9.6

La rappresentazione numerica della porta locale. Per esempio, 80 o 21.

socket.localFamily

Aggiunto in: v18.8.0, v16.18.0

La rappresentazione stringa della famiglia IP locale. 'IPv4' o 'IPv6'.

socket.pause()

Mette in pausa la lettura dei dati. Cioè, gli eventi 'data' non verranno emessi. Utile per ridurre un caricamento.

socket.pending

Aggiunto in: v11.2.0, v10.16.0

Questo è true se il socket non è ancora connesso, o perché .connect() non è stato ancora chiamato o perché è ancora in fase di connessione (vedi socket.connecting).

socket.ref()

Aggiunto in: v0.9.1

L'opposto di unref(), chiamare ref() su un socket precedentemente unref non consentirà al programma di uscire se è l'unico socket rimasto (il comportamento predefinito). Se il socket è ref chiamare di nuovo ref non avrà alcun effetto.

socket.remoteAddress

Aggiunto in: v0.5.10

La rappresentazione stringa dell'indirizzo IP remoto. Per esempio, '74.125.127.100' o '2001:4860:a005::68'. Il valore può essere undefined se il socket viene distrutto (per esempio, se il client si disconnette).

socket.remoteFamily

Aggiunto in: v0.11.14

La rappresentazione stringa della famiglia IP remota. 'IPv4' o 'IPv6'. Il valore può essere undefined se il socket viene distrutto (per esempio, se il client si disconnette).

socket.remotePort

Aggiunto in: v0.5.10

La rappresentazione numerica della porta remota. Per esempio, 80 o 21. Il valore può essere undefined se il socket viene distrutto (per esempio, se il client si disconnette).

socket.resetAndDestroy()

Aggiunto in: v18.3.0, v16.17.0

Chiude la connessione TCP inviando un pacchetto RST e distrugge lo stream. Se questo socket TCP è in stato di connessione, invierà un pacchetto RST e distruggerà questo socket TCP una volta connesso. Altrimenti, chiamerà socket.destroy con un errore ERR_SOCKET_CLOSED. Se questo non è un socket TCP (per esempio, una pipe), chiamare questo metodo genererà immediatamente un errore ERR_INVALID_HANDLE_TYPE.

socket.resume()

Riprende la lettura dopo una chiamata a socket.pause().

socket.setEncoding([encoding])

Aggiunto in: v0.1.90

Imposta la codifica per il socket come uno Stream Leggibile. Vedere readable.setEncoding() per maggiori informazioni.

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

[Cronologia]

VersioneModifiche
v13.12.0, v12.17.0Sono stati aggiunti nuovi valori predefiniti per le opzioni socket TCP_KEEPCNT e TCP_KEEPINTVL.
v0.1.92Aggiunto in: v0.1.92

Abilita/disabilita la funzionalità keep-alive e, facoltativamente, imposta il ritardo iniziale prima che venga inviata la prima sonda keepalive su un socket inattivo.

Impostare initialDelay (in millisecondi) per impostare il ritardo tra l'ultimo pacchetto di dati ricevuto e la prima sonda keepalive. Impostare 0 per initialDelay lascerà il valore invariato rispetto all'impostazione predefinita (o precedente).

L'abilitazione della funzionalità keep-alive imposterà le seguenti opzioni del socket:

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

socket.setNoDelay([noDelay])

Aggiunto in: v0.1.90

Abilita/disabilita l'uso dell'algoritmo di Nagle.

Quando viene creata una connessione TCP, l'algoritmo di Nagle sarà abilitato.

L'algoritmo di Nagle ritarda i dati prima che vengano inviati tramite la rete. Tenta di ottimizzare il throughput a scapito della latenza.

Passare true per noDelay o non passare un argomento disabiliterà l'algoritmo di Nagle per il socket. Passare false per noDelay abiliterà l'algoritmo di Nagle.

socket.setTimeout(timeout[, callback])

[Cronologia]

VersioneModifiche
v18.0.0Passare una callback non valida all'argomento callback ora genera ERR_INVALID_ARG_TYPE invece di ERR_INVALID_CALLBACK.
v0.1.90Aggiunto in: v0.1.90

Imposta il socket in modo che scada dopo timeout millisecondi di inattività sul socket. Per impostazione predefinita, net.Socket non ha un timeout.

Quando viene attivato un timeout di inattività, il socket riceverà un evento 'timeout' ma la connessione non verrà interrotta. L'utente deve chiamare manualmente socket.end() o socket.destroy() per terminare la connessione.

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

Se timeout è 0, il timeout di inattività esistente viene disabilitato.

Il parametro opzionale callback verrà aggiunto come listener una tantum per l'evento 'timeout'.

socket.timeout

Aggiunto in: v10.7.0

Il timeout del socket in millisecondi impostato da socket.setTimeout(). È undefined se non è stato impostato un timeout.

socket.unref()

Aggiunto in: v0.9.1

Chiamare unref() su un socket consentirà al programma di terminare se questo è l'unico socket attivo nel sistema di eventi. Se il socket è già unref, chiamare nuovamente unref() non avrà alcun effetto.

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

Aggiunto in: v0.1.90

Invia i dati sul socket. Il secondo parametro specifica la codifica nel caso di una stringa. Il valore predefinito è la codifica UTF8.

Restituisce true se tutti i dati sono stati scaricati correttamente nel buffer del kernel. Restituisce false se tutti o parte dei dati sono stati accodati nella memoria utente. L'evento 'drain' verrà emesso quando il buffer sarà di nuovo libero.

Il parametro opzionale callback verrà eseguito quando i dati saranno finalmente scritti, il che potrebbe non essere immediato.

Vedi il metodo write() dello stream Writable per maggiori informazioni.

socket.readyState

Aggiunto in: v0.5.0

Questa proprietà rappresenta lo stato della connessione come una stringa.

  • Se lo stream è in fase di connessione, socket.readyState è opening.
  • Se lo stream è leggibile e scrivibile, è open.
  • Se lo stream è leggibile e non scrivibile, è readOnly.
  • Se lo stream non è leggibile e scrivibile, è writeOnly.

net.connect()

Alias per net.createConnection().

Possibili firme:

net.connect(options[, connectListener])

Aggiunto in: v0.7.0

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

net.connect(path[, connectListener])

Aggiunto in: v0.1.90

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

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

Aggiunto in: v0.1.90

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

net.createConnection()

Una funzione factory, che crea un nuovo net.Socket, avvia immediatamente la connessione con socket.connect(), quindi restituisce il net.Socket che avvia la connessione.

Quando la connessione è stabilita, verrà emesso un evento 'connect' sul socket restituito. L'ultimo parametro connectListener, se fornito, verrà aggiunto come listener per l'evento 'connect' una sola volta.

Possibili firme:

La funzione net.connect() è un alias per questa funzione.

net.createConnection(options[, connectListener])

Aggiunto in: v0.1.90

Per le opzioni disponibili, vedere new net.Socket([options]) e socket.connect(options[, connectListener]).

Opzioni aggiuntive:

Di seguito è riportato un esempio di client del server echo descritto nella sezione net.createServer():

js
import net from 'node:net'
const client = net.createConnection({ port: 8124 }, () => {
  // listener 'connect'.
  console.log('connesso al server!')
  client.write('mondo!\r\n')
})
client.on('data', data => {
  console.log(data.toString())
  client.end()
})
client.on('end', () => {
  console.log('disconnesso dal server')
})
js
const net = require('node:net')
const client = net.createConnection({ port: 8124 }, () => {
  // listener 'connect'.
  console.log('connesso al server!')
  client.write('mondo!\r\n')
})
client.on('data', data => {
  console.log(data.toString())
  client.end()
})
client.on('end', () => {
  console.log('disconnesso dal server')
})

Per connettersi sul socket /tmp/echo.sock:

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

Di seguito è riportato un esempio di client che utilizza l'opzione port e onread. In questo caso, l'opzione onread verrà utilizzata solo per chiamare new net.Socket([options]) e l'opzione port verrà utilizzata per chiamare socket.connect(options[, connectListener]).

js
import net from 'node:net'
import { Buffer } from 'node:buffer'
net.createConnection({
  port: 8124,
  onread: {
    // Riutilizza un Buffer da 4KiB per ogni lettura dal socket.
    buffer: Buffer.alloc(4 * 1024),
    callback: function (nread, buf) {
      // I dati ricevuti sono disponibili in `buf` da 0 a `nread`.
      console.log(buf.toString('utf8', 0, nread))
    },
  },
})
js
const net = require('node:net')
net.createConnection({
  port: 8124,
  onread: {
    // Riutilizza un Buffer da 4KiB per ogni lettura dal socket.
    buffer: Buffer.alloc(4 * 1024),
    callback: function (nread, buf) {
      // I dati ricevuti sono disponibili in `buf` da 0 a `nread`.
      console.log(buf.toString('utf8', 0, nread))
    },
  },
})

net.createConnection(path[, connectListener])

Aggiunto in: v0.1.90

Avvia una connessione IPC.

Questa funzione crea un nuovo net.Socket con tutte le opzioni impostate al valore predefinito, avvia immediatamente la connessione con socket.connect(path[, connectListener]), quindi restituisce il net.Socket che avvia la connessione.

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

Aggiunto in: v0.1.90

Avvia una connessione TCP.

Questa funzione crea un nuovo net.Socket con tutte le opzioni impostate al valore predefinito, avvia immediatamente la connessione con socket.connect(port[, host][, connectListener]), quindi restituisce il net.Socket che avvia la connessione.

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

[Cronologia]

VersioneModifiche
v20.1.0, v18.17.0L'opzione highWaterMark è ora supportata.
v17.7.0, v16.15.0Le opzioni noDelay, keepAlive e keepAliveInitialDelay sono ora supportate.
v0.5.0Aggiunto in: v0.5.0
  • options <Object>

    • allowHalfOpen <boolean> Se impostato su false, il socket terminerà automaticamente il lato scrivibile quando termina il lato leggibile. Predefinito: false.
    • highWaterMark <number> Sovrascrive facoltativamente tutti i readableHighWaterMark e writableHighWaterMark di net.Socket. Predefinito: Vedi stream.getDefaultHighWaterMark().
    • keepAlive <boolean> Se impostato su true, abilita la funzionalità keep-alive sul socket immediatamente dopo la ricezione di una nuova connessione in entrata, in modo simile a quanto fatto in socket.setKeepAlive(). Predefinito: false.
    • keepAliveInitialDelay <number> Se impostato su un numero positivo, imposta il ritardo iniziale prima che venga inviata la prima sonda keepalive su un socket inattivo. Predefinito: 0.
    • noDelay <boolean> Se impostato su true, disabilita l'uso dell'algoritmo di Nagle immediatamente dopo la ricezione di una nuova connessione in entrata. Predefinito: false.
    • pauseOnConnect <boolean> Indica se il socket deve essere messo in pausa sulle connessioni in entrata. Predefinito: false.
    • blockList <net.BlockList> blockList può essere utilizzato per disabilitare l'accesso in entrata a indirizzi IP, intervalli IP o sottoreti IP specifici. Questo non funziona se il server si trova dietro un proxy inverso, un NAT, ecc. perché l'indirizzo verificato rispetto alla lista di blocco è l'indirizzo del proxy o quello specificato dal NAT.
  • connectionListener <Function> Impostato automaticamente come listener per l'evento 'connection'.

  • Restituisce: <net.Server>

Crea un nuovo server TCP o IPC.

Se allowHalfOpen è impostato su true, quando l'altra estremità del socket segnala la fine della trasmissione, il server invierà la fine della trasmissione solo quando viene esplicitamente chiamato socket.end(). Ad esempio, nel contesto di TCP, quando viene ricevuto un pacchetto FIN, viene inviato un pacchetto FIN solo quando socket.end() viene chiamato esplicitamente. Fino ad allora la connessione è semi-chiusa (non leggibile ma ancora scrivibile). Vedi l'evento 'end' e RFC 1122 (sezione 4.2.2.13) per maggiori informazioni.

Se pauseOnConnect è impostato su true, il socket associato a ciascuna connessione in entrata verrà messo in pausa e nessun dato verrà letto dal suo handle. Ciò consente di passare le connessioni tra i processi senza che il processo originale legga alcun dato. Per iniziare a leggere i dati da un socket in pausa, chiama socket.resume().

Il server può essere un server TCP o un server IPC, a seconda di cosa listen().

Ecco un esempio di server eco TCP che ascolta le connessioni sulla porta 8124:

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

Testa questo usando telnet:

bash
telnet localhost 8124

Per ascoltare il socket /tmp/echo.sock:

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

Utilizza nc per connetterti a un server socket di dominio Unix:

bash
nc -U /tmp/echo.sock

net.getDefaultAutoSelectFamily()

Aggiunto in: v19.4.0

Ottiene il valore predefinito corrente dell'opzione autoSelectFamily di socket.connect(options). Il valore predefinito iniziale è true, a meno che non venga fornita l'opzione da riga di comando --no-network-family-autoselection.

  • Restituisce: <boolean> Il valore predefinito corrente dell'opzione autoSelectFamily.

net.setDefaultAutoSelectFamily(value)

Aggiunto in: v19.4.0

Imposta il valore predefinito dell'opzione autoSelectFamily di socket.connect(options).

  • value <boolean> Il nuovo valore predefinito. Il valore predefinito iniziale è true, a meno che non venga fornita l'opzione da riga di comando --no-network-family-autoselection.

net.getDefaultAutoSelectFamilyAttemptTimeout()

Aggiunto in: v19.8.0, v18.18.0

Ottiene il valore predefinito corrente dell'opzione autoSelectFamilyAttemptTimeout di socket.connect(options). Il valore predefinito iniziale è 250 o il valore specificato tramite l'opzione da riga di comando --network-family-autoselection-attempt-timeout.

  • Restituisce: <number> Il valore predefinito corrente dell'opzione autoSelectFamilyAttemptTimeout.

net.setDefaultAutoSelectFamilyAttemptTimeout(value)

Aggiunto in: v19.8.0, v18.18.0

Imposta il valore predefinito dell'opzione autoSelectFamilyAttemptTimeout di socket.connect(options).

  • value <number> Il nuovo valore predefinito, che deve essere un numero positivo. Se il numero è inferiore a 10, viene utilizzato invece il valore 10. Il valore predefinito iniziale è 250 o il valore specificato tramite l'opzione da riga di comando --network-family-autoselection-attempt-timeout.

net.isIP(input)

Aggiunto in: v0.3.0

Restituisce 6 se input è un indirizzo IPv6. Restituisce 4 se input è un indirizzo IPv4 in notazione decimale puntata senza zeri iniziali. Altrimenti, restituisce 0.

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

net.isIPv4(input)

Aggiunto in: v0.3.0

Restituisce true se input è un indirizzo IPv4 in notazione decimale puntata senza zeri iniziali. Altrimenti, restituisce false.

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

net.isIPv6(input)

Aggiunto in: v0.3.0

Restituisce true se input è un indirizzo IPv6. Altrimenti, restituisce false.

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