Skip to content

Net

[Стабильно: 2 - Стабильно]

Стабильно: 2 Стабильность: 2 - Стабильно

Исходный код: lib/net.js

Модуль node:net предоставляет асинхронный сетевой API для создания потоковых TCP-серверов или серверов IPC (net.createServer()) и клиентов (net.createConnection()).

Доступ к нему можно получить с помощью:

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

Поддержка IPC

[История]

ВерсияИзменения
v20.8.0Поддержка привязки к абстрактному пути сокета Unix-домена, например \0abstract. Можно привязаться к '\0' для Node.js \< v20.4.0.

Модуль node:net поддерживает IPC с именованными каналами в Windows и сокетами Unix-домена в других операционных системах.

Идентификация путей для IPC-соединений

net.connect(), net.createConnection(), server.listen() и socket.connect() принимают параметр path для идентификации конечных точек IPC.

В Unix локальная область также известна как область Unix. Путь представляет собой имя файла в файловой системе. Возникнет ошибка, если длина имени пути превышает длину sizeof(sockaddr_un.sun_path). Типичные значения составляют 107 байт в Linux и 103 байта в macOS. Если абстракция API Node.js создает сокет Unix-домена, она также отвяжет сокет Unix-домена. Например, net.createServer() может создать сокет Unix-домена, а server.close() отвяжет его. Но если пользователь создает сокет Unix-домена вне этих абстракций, пользователю потребуется удалить его. То же самое относится к случаю, когда API Node.js создает сокет Unix-домена, но программа затем аварийно завершается. Короче говоря, сокет Unix-домена будет виден в файловой системе и будет существовать до тех пор, пока не будет отвязан. В Linux можно использовать абстрактный сокет Unix, добавив \0 в начало пути, например \0abstract. Путь к абстрактному сокету Unix не виден в файловой системе, и он исчезнет автоматически, когда будут закрыты все открытые ссылки на сокет.

В Windows локальная область реализована с помощью именованного канала. Путь должен ссылаться на запись в \\?\pipe\ или \\.\pipe\. Допускаются любые символы, но последний может выполнять некоторую обработку имен каналов, например, разрешение последовательностей ... Несмотря на то, как это может выглядеть, пространство имен каналов является плоским. Каналы не будут сохраняться. Они удаляются, когда закрывается последняя ссылка на них. В отличие от сокетов Unix-домена, Windows закроет и удалит канал при выходе владеющего процесса.

Для экранирования строк JavaScript пути необходимо указывать с дополнительным экранированием обратной косой черты, например:

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

Класс: net.BlockList

Добавлено в: v15.0.0, v14.18.0

Объект BlockList может использоваться с некоторыми сетевыми API для указания правил отключения входящего или исходящего доступа к определенным IP-адресам, диапазонам IP-адресов или IP-подсетям.

blockList.addAddress(address[, type])

Добавлено в: v15.0.0, v14.18.0

Добавляет правило для блокировки заданного IP-адреса.

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

Добавлено в: v15.0.0, v14.18.0

Добавляет правило для блокировки диапазона IP-адресов от start (включительно) до end (включительно).

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

Добавлено в: v15.0.0, v14.18.0

  • net <string> | <net.SocketAddress> Сетевой IPv4 или IPv6 адрес.
  • prefix <number> Количество бит префикса CIDR. Для IPv4 это должно быть значение от 0 до 32. Для IPv6 это должно быть значение от 0 до 128.
  • type <string> Либо 'ipv4', либо 'ipv6'. По умолчанию: 'ipv4'.

Добавляет правило для блокировки диапазона IP-адресов, указанного как маска подсети.

blockList.check(address[, type])

Добавлен в: v15.0.0, v14.18.0

Возвращает true, если заданный IP-адрес соответствует любому из правил, добавленных в 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')) // Выводит: true
console.log(blockList.check('10.0.0.3')) // Выводит: true
console.log(blockList.check('222.111.111.222')) // Выводит: false

// Запись IPv6 для IPv4 адресов работает:
console.log(blockList.check('::ffff:7b7b:7b7b', 'ipv6')) // Выводит: true
console.log(blockList.check('::ffff:123.123.123.123', 'ipv6')) // Выводит: true

blockList.rules

Добавлен в: v15.0.0, v14.18.0

Список правил, добавленных в черный список.

BlockList.isBlockList(value)

Добавлен в: v23.4.0

  • value <any> Любое значение JS
  • Возвращает true, если value является net.BlockList.

Класс: net.SocketAddress

Добавлен в: v15.14.0, v14.18.0

new net.SocketAddress([options])

Добавлен в: v15.14.0, v14.18.0

  • options <Object>
    • address <string> Сетевой адрес в виде строки IPv4 или IPv6. По умолчанию: '127.0.0.1', если family'ipv4'; '::', если family'ipv6'.
    • family <string> 'ipv4' или 'ipv6'. По умолчанию: 'ipv4'.
    • flowlabel <number> Метка потока IPv6, используется только если family'ipv6'.
    • port <number> IP-порт.

socketaddress.address

Добавлено в: v15.14.0, v14.18.0

socketaddress.family

Добавлено в: v15.14.0, v14.18.0

  • Тип <string> Либо 'ipv4', либо 'ipv6'.

socketaddress.flowlabel

Добавлено в: v15.14.0, v14.18.0

socketaddress.port

Добавлено в: v15.14.0, v14.18.0

SocketAddress.parse(input)

Добавлено в: v23.4.0

  • input <string> Входная строка, содержащая IP-адрес и необязательный порт, например, 123.1.2.3:1234 или [1::1]:1234.
  • Возвращает: <net.SocketAddress> Возвращает SocketAddress, если разбор был успешным. В противном случае возвращает undefined.

Класс: net.Server

Добавлено в: v0.1.90

Этот класс используется для создания TCP или IPC сервера.

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

net.Server является EventEmitter со следующими событиями:

Событие: 'close'

Добавлено в: v0.5.0

Генерируется при закрытии сервера. Если существуют соединения, это событие не генерируется до тех пор, пока все соединения не будут завершены.

Событие: 'connection'

Добавлено в: v0.1.90

Генерируется при установлении нового соединения. socket — это экземпляр net.Socket.

Событие: 'error'

Добавлено в: v0.1.90

Генерируется при возникновении ошибки. В отличие от net.Socket, событие 'close' не будет генерироваться непосредственно после этого события, если только server.close() не будет вызвано вручную. См. пример в обсуждении server.listen().

Событие: 'listening'

Добавлено в: v0.1.90

Генерируется после привязки сервера после вызова server.listen().

Событие: 'drop'

Добавлено в: v18.6.0, v16.17.0

Когда количество соединений достигает порога server.maxConnections, сервер будет отклонять новые соединения и генерировать событие 'drop'. Если это TCP-сервер, аргумент будет следующим, в противном случае аргумент будет undefined.

  • data <Object> Аргумент, передаваемый обработчику событий.
    • localAddress <string> Локальный адрес.
    • localPort <number> Локальный порт.
    • localFamily <string> Локальное семейство.
    • remoteAddress <string> Удалённый адрес.
    • remotePort <number> Удалённый порт.
    • remoteFamily <string> Удалённое семейство IP. 'IPv4' или 'IPv6'.

server.address()

[История]

ВерсияИзменения
v18.4.0Свойство family теперь возвращает строку, а не число.
v18.0.0Свойство family теперь возвращает число, а не строку.
v0.1.90Добавлено в: v0.1.90

Возвращает привязанный address, имя семейства адресов family и port сервера, как сообщается операционной системой, если прослушивание происходит на IP-сокете (полезно для того, чтобы узнать, какой порт был назначен при получении адреса, назначенного ОС): { port: 12346, family: 'IPv4', address: '127.0.0.1' }.

Для сервера, прослушивающего именованный канал или сокет домена Unix, имя возвращается как строка.

js
const server = net
  .createServer(socket => {
    socket.end('goodbye\n')
  })
  .on('error', err => {
    // Обработка ошибок здесь.
    throw err
  })

// Захват произвольного неиспользуемого порта.
server.listen(() => {
  console.log('opened server on', server.address())
})

server.address() возвращает null до того, как событие 'listening' было отправлено, или после вызова server.close().

server.close([callback])

Добавлено в: v0.1.90

  • callback <Function> Вызывается при закрытии сервера.
  • Возвращает: <net.Server>

Останавливает сервер от принятия новых подключений и сохраняет существующие подключения. Эта функция асинхронна, сервер окончательно закрывается, когда все подключения завершены, и сервер отправляет событие 'close'. Необязательный callback будет вызван после того, как произойдет событие 'close'. В отличие от этого события, он будет вызван с Error в качестве единственного аргумента, если сервер не был открыт, когда он был закрыт.

server[Symbol.asyncDispose]()

Добавлено в: v20.5.0, v18.18.0

[Стабильно: 1 - Экспериментально]

Стабильно: 1 Стабильность: 1 - Экспериментально

Вызывает server.close() и возвращает promise, который выполняется после закрытия сервера.

server.getConnections(callback)

Добавлено в: v0.9.7

Асинхронно получает количество одновременных подключений к серверу. Работает, когда сокеты были отправлены в forks.

Обратный вызов должен принимать два аргумента err и count.

server.listen()

Запускает прослушивание сервером подключений. net.Server может быть TCP или IPC сервером в зависимости от того, что он прослушивает.

Возможные сигнатуры:

Эта функция асинхронна. Когда сервер начнет прослушивание, будет вызвано событие 'listening'. Последний параметр callback будет добавлен как слушатель события 'listening'.

Все методы listen() могут принимать параметр backlog для указания максимальной длины очереди ожидающих подключений. Фактическая длина будет определяться ОС через настройки sysctl, такие как tcp_max_syn_backlog и somaxconn в Linux. Значение по умолчанию этого параметра равно 511 (а не 512).

Все net.Socket устанавливаются на SO_REUSEADDR (см. socket(7) для подробностей).

Метод server.listen() может быть вызван повторно только в том случае, если произошла ошибка во время первого вызова server.listen() или был вызван server.close(). В противном случае будет выброшена ошибка ERR_SERVER_ALREADY_LISTEN.

Одной из наиболее распространенных ошибок, возникающих при прослушивании, является EADDRINUSE. Это происходит, когда другой сервер уже прослушивает указанный port/path/handle. Один из способов обработки этого — повторить попытку через некоторое время:

js
server.on('error', e => {
  if (e.code === 'EADDRINUSE') {
    console.error('Адрес используется, повторяю попытку...')
    setTimeout(() => {
      server.close()
      server.listen(PORT, HOST)
    }, 1000)
  }
})

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

Добавлен в: v0.5.10

Запускает сервер, прослушивающий подключения на заданном handle, который уже был привязан к порту, сокету домена Unix или именованному каналу Windows.

Объект handle может быть сервером, сокетом (любым объектом с базовым членом _handle) или объектом с членом fd, который является действительным дескриптором файла.

Прослушивание дескриптора файла не поддерживается в Windows.

server.listen(options[, callback])

[История]

ВерсияИзменения
v23.1.0Поддерживается опция reusePort.
v15.6.0Добавлена поддержка AbortSignal.
v11.4.0Поддерживается опция ipv6Only.
v0.11.14Добавлено в: v0.11.14
  • options <Object> Обязательно. Поддерживает следующие свойства:

    • backlog <number> Обычный параметр функций server.listen().
    • exclusive <boolean> По умолчанию: false
    • host <string>
    • ipv6Only <boolean> Для TCP-серверов установка ipv6Only в true отключит поддержку двойного стека, т. е. привязка к хосту :: не приведет к привязке 0.0.0.0. По умолчанию: false.
    • reusePort <boolean> Для TCP-серверов установка reusePort в true позволяет нескольким сокетам на одном хосте привязываться к одному и тому же порту. Входящие подключения распределяются операционной системой между прослушивающими сокетами. Эта опция доступна только на некоторых платформах, таких как Linux 3.9+, DragonFlyBSD 3.6+, FreeBSD 12.0+, Solaris 11.4 и AIX 7.2.5+. По умолчанию: false.
    • path <string> Будет игнорироваться, если указан port. См. Идентификация путей для IPC-подключений.
    • port <number>
    • readableAll <boolean> Для IPC-серверов делает канал доступным для чтения для всех пользователей. По умолчанию: false.
    • signal <AbortSignal> AbortSignal, который может использоваться для закрытия прослушивающего сервера.
    • writableAll <boolean> Для IPC-серверов делает канал доступным для записи для всех пользователей. По умолчанию: false.
  • callback <Function> функции.

  • Возвращает: <net.Server>

Если указан port, он ведет себя так же, как server.listen([port[, host[, backlog]]][, callback]). В противном случае, если указан path, он ведет себя так же, как server.listen(path[, backlog][, callback]). Если ни один из них не указан, будет выброшена ошибка.

Если exclusive имеет значение false (по умолчанию), то рабочие процессы кластера будут использовать один и тот же базовый обработчик, что позволит совместно использовать обязанности по обработке подключений. Когда exclusive имеет значение true, обработчик не используется совместно, и попытка совместного использования порта приводит к ошибке. Пример прослушивания на эксклюзивном порту показан ниже.

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

Когда exclusive имеет значение true, и базовый обработчик используется совместно, возможно, что несколько рабочих процессов запрашивают обработчик с разными значениями backlog. В этом случае будет использоваться первое значение backlog, переданное главному процессу.

Запуск IPC-сервера от имени root может привести к тому, что путь к серверу станет недоступен для пользователей без прав. Использование readableAll и writableAll сделает сервер доступным для всех пользователей.

Если включена опция signal, вызов .abort() для соответствующего AbortController аналогичен вызову .close() для сервера:

js
const controller = new AbortController()
server.listen({
  host: 'localhost',
  port: 80,
  signal: controller.signal,
})
// Позже, когда вы захотите закрыть сервер.
controller.abort()

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

Добавлено в: v0.1.90

Запуск IPC-сервера, прослушивающего соединения по указанному path.

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

Добавлено в: v0.1.90

Запуск TCP-сервера, прослушивающего соединения на указанном port и host.

Если port пропущен или равен 0, операционная система назначит произвольный неиспользуемый порт, который можно получить с помощью server.address().port после того, как событие 'listening' будет испущено.

Если host пропущен, сервер будет принимать соединения по неуказанному IPv6-адресу (::), если доступен IPv6, или по неуказанному IPv4-адресу (0.0.0.0) в противном случае.

В большинстве операционных систем прослушивание неуказанного IPv6-адреса (::) может привести к тому, что net.Server также будет прослушивать неуказанный IPv4-адрес (0.0.0.0).

server.listening

Добавлено в: v5.7.0

  • <boolean> Указывает, ожидает ли сервер подключения.

server.maxConnections

[История]

ВерсияИзменения
v21.0.0Установка maxConnections в 0 отключает все входящие соединения. Ранее это интерпретировалось как Infinity.
v0.2.0Добавлено в: v0.2.0

Когда количество соединений достигает порога server.maxConnections:

Не рекомендуется использовать этот параметр после отправки сокета дочернему процессу с помощью child_process.fork().

server.dropMaxConnection

Добавлено в: v23.1.0

Установите это свойство в true, чтобы начать закрывать соединения, как только количество соединений достигнет порога [server.maxConnections][]. Эта настройка эффективна только в кластерном режиме.

server.ref()

Добавлено в: v0.9.1

Противоположность unref(). Вызов ref() для ранее unrefed сервера не позволит программе завершиться, если это единственный оставшийся сервер (поведение по умолчанию). Если сервер refed, повторный вызов ref() не будет иметь никакого эффекта.

server.unref()

Добавлено в: v0.9.1

Вызов unref() для сервера позволит программе завершиться, если это единственный активный сервер в системе событий. Если сервер уже unrefed, повторный вызов unref() не будет иметь никакого эффекта.

Класс: net.Socket

Добавлено в: v0.3.4

Этот класс является абстракцией TCP-сокета или конечной точки потокового IPC (использует именованные каналы в Windows и Unix-сокеты домена в других случаях). Он также является EventEmitter.

net.Socket может быть создан пользователем и использоваться напрямую для взаимодействия с сервером. Например, он возвращается функцией net.createConnection(), поэтому пользователь может использовать его для связи с сервером.

Он также может быть создан Node.js и передан пользователю при получении соединения. Например, он передается слушателям события 'connection', генерируемого net.Server, поэтому пользователь может использовать его для взаимодействия с клиентом.

new net.Socket([options])

[История]

ВерсияИзменения
v15.14.0Добавлена поддержка AbortSignal.
v12.10.0Добавлен параметр onread.
v0.3.4Добавлено в: v0.3.4
  • options <Object> Доступные параметры:

    • allowHalfOpen <boolean> Если установлено в false, то сокет автоматически завершит запись, когда завершится чтение. См. net.createServer() и событие 'end' для подробностей. По умолчанию: false.

    • fd <number> Если указан, оборачивает существующий сокет с заданным дескриптором файла, иначе будет создан новый сокет.

    • onread <Object> Если указан, входящие данные хранятся в одном buffer и передаются в предоставленный callback, когда данные поступают в сокет. Это приведет к тому, что функциональность потоковой передачи не будет предоставлять никаких данных. События сокета, такие как 'error', 'end' и 'close', будут вызываться как обычно. Методы, такие как pause() и resume(), также будут работать как ожидается.

    • buffer <Buffer> | <Uint8Array> | <Function> Либо повторно используемый фрагмент памяти для хранения входящих данных, либо функция, которая его возвращает.

    • callback <Function> Эта функция вызывается для каждого фрагмента входящих данных. Ей передаются два аргумента: количество байтов, записанных в buffer, и ссылка на buffer. Верните false из этой функции, чтобы неявно pause() сокет. Эта функция будет выполнена в глобальном контексте.

    • readable <boolean> Разрешить чтение из сокета, когда передан fd, иначе игнорируется. По умолчанию: false.

    • signal <AbortSignal> Сигнал прерывания, который может использоваться для уничтожения сокета.

    • writable <boolean> Разрешить запись в сокет, когда передан fd, иначе игнорируется. По умолчанию: false.

  • Возвращает: <net.Socket>

Создает новый объект сокета.

Недавно созданный сокет может быть либо TCP-сокет, либо конечная точка потоковой передачи IPC, в зависимости от того, к чему он connect().

Событие: 'close'

Добавлено в: v0.1.90

  • hadError <boolean> true, если у сокета произошла ошибка передачи.

Вызывается после полного закрытия сокета. Аргумент hadError — это булево значение, указывающее, был ли сокет закрыт из-за ошибки передачи.

Событие: 'connect'

Добавлено в: v0.1.90

Вызывается при успешном установлении соединения сокета. См. net.createConnection().

Событие: 'connectionAttempt'

Добавлено в: v21.6.0, v20.12.0

  • ip <string> IP-адрес, к которому сокет пытается подключиться.
  • port <number> Порт, к которому сокет пытается подключиться.
  • family <number> Семейство IP-адреса. Может быть 6 для IPv6 или 4 для IPv4.

Вызывается при запуске новой попытки подключения. Это событие может быть вызвано несколько раз, если в socket.connect(options) включен алгоритм автоматического выбора семейства.

Событие: 'connectionAttemptFailed'

Добавлено в: v21.6.0, v20.12.0

  • ip <string> IP-адрес, к которому сокет пытался подключиться.
  • port <number> Порт, к которому сокет пытался подключиться.
  • family <number> Семейство IP-адреса. Может быть 6 для IPv6 или 4 для IPv4.
  • error <Error> Ошибка, связанная с неудачей.

Вызывается при неудаче попытки подключения. Это событие может быть вызвано несколько раз, если в socket.connect(options) включен алгоритм автоматического выбора семейства.

Событие: 'connectionAttemptTimeout'

Добавлено в: v21.6.0, v20.12.0

  • ip <string> IP-адрес, к которому сокет пытался подключиться.
  • port <number> Порт, к которому сокет пытался подключиться.
  • family <number> Семейство IP-адреса. Может быть 6 для IPv6 или 4 для IPv4.

Генерируется при истечении времени ожидания попытки подключения. Это событие генерируется (и может генерироваться несколько раз) только в том случае, если алгоритм автоматического выбора семейства включен в socket.connect(options).

Событие: 'data'

Добавлено в: v0.1.90

Генерируется при получении данных. Аргумент data будет Buffer или String. Кодировка данных устанавливается с помощью socket.setEncoding().

Данные будут потеряны, если обработчик отсутствует, когда Socket генерирует событие 'data'.

Событие: 'drain'

Добавлено в: v0.1.90

Генерируется, когда буфер записи становится пустым. Может использоваться для регулирования загрузки.

См. также: возвращаемые значения socket.write().

Событие: 'end'

Добавлено в: v0.1.90

Генерируется, когда другой конец сокета сигнализирует об окончании передачи, тем самым завершая читаемую сторону сокета.

По умолчанию (allowHalfOpen имеет значение false) сокет отправит пакет окончания передачи и уничтожит свой файловый дескриптор, как только он запишет свою ожидающую очередь записи. Однако, если allowHalfOpen установлено в true, сокет не будет автоматически end() свою записываемую сторону, позволяя пользователю записывать произвольные объемы данных. Пользователь должен явно вызвать end(), чтобы закрыть соединение (т.е. отправить пакет FIN).

Событие: 'error'

Добавлено в: v0.1.90

Генерируется при возникновении ошибки. Событие 'close' будет вызвано непосредственно после этого события.

Событие: 'lookup'

[История]

ВерсияИзменения
v5.10.0Теперь поддерживается параметр host.
v0.11.3Добавлено в: v0.11.3

Генерируется после разрешения имени хоста, но до установления соединения. Не применимо к Unix-сокетам.

Событие: 'ready'

Добавлено в: v9.11.0

Генерируется, когда сокет готов к использованию.

Вызывается сразу после 'connect'.

Событие: 'timeout'

Добавлено в: v0.1.90

Генерируется, если сокет выходит из строя из-за бездействия. Это лишь уведомление о том, что сокет был неактивен. Пользователь должен вручную закрыть соединение.

См. также: socket.setTimeout().

socket.address()

[История]

ВерсияИзменения
v18.4.0Свойство family теперь возвращает строку, а не число.
v18.0.0Свойство family теперь возвращает число, а не строку.
v0.1.90Добавлено в: v0.1.90

Возвращает связанный address, имя семейства адресов family и port сокета, как сообщается операционной системой: { port: 12346, family: 'IPv4', address: '127.0.0.1' }

socket.autoSelectFamilyAttemptedAddresses

Добавлен в: v19.4.0, v18.18.0

Это свойство присутствует только в том случае, если алгоритм автоматического выбора семейства включен в socket.connect(options), и представляет собой массив адресов, которые были опробованы.

Каждый адрес — это строка в формате $IP:$PORT. Если соединение прошло успешно, последний адрес — это тот, к которому сокет сейчас подключен.

socket.bufferSize

Добавлен в: v0.3.8

Устарел с: v14.6.0

[Стабильность: 0 - Устарело]

Стабильность: 0 Стабильность: 0 - Устарело: Используйте writable.writableLength вместо этого.

Это свойство показывает количество символов, буферизованных для записи. Буфер может содержать строки, длина которых после кодирования ещё не известна. Поэтому это число является лишь приблизительным значением количества байтов в буфере.

net.Socket имеет свойство, благодаря которому socket.write() всегда работает. Это помогает пользователям быстро начать работу. Компьютер не всегда может обрабатывать количество данных, записываемых в сокет. Сетевое соединение может быть просто слишком медленным. Node.js внутренне будет ставить в очередь данные, записанные в сокет, и отправлять их по сети, когда это станет возможным.

Следствием этого внутреннего буферизации является то, что объём памяти может увеличиваться. Пользователи, сталкивающиеся с большими или растущими значениями bufferSize, должны попытаться «регулировать» потоки данных в своей программе с помощью socket.pause() и socket.resume().

socket.bytesRead

Добавлен в: v0.5.3

Количество полученных байтов.

socket.bytesWritten

Добавлен в: v0.5.3

Количество отправленных байтов.

socket.connect()

Инициирует соединение на заданном сокете.

Возможные сигнатуры:

Эта функция асинхронна. Когда соединение установлено, будет вызвано событие 'connect'. Если возникла проблема с подключением, вместо события 'connect' будет вызвано событие 'error' с ошибкой, переданной в обработчик 'error'. Последний параметр connectListener, если указан, будет добавлен как обработчик события 'connect' однократно.

Эта функция должна использоваться только для повторного подключения сокета после того, как было вызвано событие 'close', иначе это может привести к неопределённому поведению.

socket.connect(options[, connectListener])

[История]

ВерсияИзменения
v19.4.0Значение по умолчанию для параметра autoSelectFamily может быть изменено во время выполнения с помощью setDefaultAutoSelectFamily или через параметр командной строки --enable-network-family-autoselection.
v20.0.0, v18.18.0Значение по умолчанию для параметра autoSelectFamily теперь равно true. Флаг CLI --enable-network-family-autoselection переименован в --network-family-autoselection. Старое имя теперь является псевдонимом, но его использование не рекомендуется.
v19.3.0, v18.13.0Добавлен параметр autoSelectFamily.
v17.7.0, v16.15.0Теперь поддерживаются параметры noDelay, keepAlive и keepAliveInitialDelay.
v6.0.0Параметр hints теперь по умолчанию равен 0 во всех случаях. Ранее, при отсутствии параметра family, он по умолчанию был равен `dns.ADDRCONFIG
v5.11.0Теперь поддерживается параметр hints.
v0.1.90Добавлено в: v0.1.90

Инициирует соединение на заданном сокете. Обычно этот метод не требуется, сокет должен быть создан и открыт с помощью net.createConnection(). Используйте это только при реализации пользовательского сокета.

Для TCP-соединений доступны следующие параметры options:

  • autoSelectFamily <boolean>: Если установлено в true, то включается алгоритм автоматического обнаружения семейства, который приблизительно реализует раздел 5 RFC 8305. Параметр all, переданный в lookup, устанавливается в true, и сокеты пытаются подключиться ко всем полученным адресам IPv6 и IPv4 последовательно, пока не будет установлено соединение. Сначала пробуется первый возвращенный адрес AAAA, затем первый возвращенный адрес A, затем второй возвращенный адрес AAAA и так далее. Каждой попытке соединения (кроме последней) даётся время, указанное параметром autoSelectFamilyAttemptTimeout, перед истечением времени ожидания и попыткой подключения к следующему адресу. Игнорируется, если параметр family не равен 0 или если установлен localAddress. Ошибки соединения не генерируются, если хотя бы одно соединение успешно. Если все попытки подключения завершатся неудачей, будет сгенерировано одно AggregateError со всеми неудачными попытками. По умолчанию: net.getDefaultAutoSelectFamily().
  • autoSelectFamilyAttemptTimeout <number>: Время в миллисекундах ожидания завершения попытки соединения перед попыткой подключения к следующему адресу при использовании параметра autoSelectFamily. Если установлено положительное целое число, меньшее 10, то вместо него будет использовано значение 10. По умолчанию: net.getDefaultAutoSelectFamilyAttemptTimeout().
  • family <number>: Версия стека IP. Должно быть 4, 6 или 0. Значение 0 указывает на то, что допускаются как IPv4, так и IPv6 адреса. По умолчанию: 0.
  • hints <number> Необязательные подсказки dns.lookup().
  • host <string> Хост, к которому должен подключаться сокет. По умолчанию: 'localhost'.
  • keepAlive <boolean>: Если установлено в true, то включает функциональность keep-alive на сокете сразу после установления соединения, аналогично тому, как это делается в socket.setKeepAlive(). По умолчанию: false.
  • keepAliveInitialDelay <number>: Если установлено положительное число, устанавливает начальную задержку перед отправкой первого запроса keepalive на неактивном сокете. По умолчанию: 0.
  • localAddress <string> Локальный адрес, с которого должен подключаться сокет.
  • localPort <number> Локальный порт, с которого должен подключаться сокет.
  • lookup <Function> Пользовательская функция поиска. По умолчанию: dns.lookup().
  • noDelay <boolean>: Если установлено в true, то отключает использование алгоритма Нагла сразу после установления сокета. По умолчанию: false.
  • port <number> Обязательно. Порт, к которому должен подключаться сокет.
  • blockList <net.BlockList> blockList может использоваться для отключения исходящего доступа к определенным IP-адресам, диапазонам IP-адресов или IP-подсетям.

Для соединений IPC доступны следующие параметры options:

socket.connect(path[, connectListener])

Инициирует IPC соединение на данном сокете.

Псевдоним для socket.connect(options[, connectListener]), вызываемого с { path: path } в качестве options.

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

Добавлено в: v0.1.90

  • port <number> Порт, к которому должен подключаться клиент.
  • host <string> Хост, к которому должен подключаться клиент.
  • connectListener <Function> Общий параметр методов socket.connect(). Будет добавлен в качестве обработчика события 'connect' один раз.
  • Возвращает: <net.Socket> Сам сокет.

Инициирует TCP-соединение на данном сокете.

Псевдоним для socket.connect(options[, connectListener]), вызываемого с {port: port, host: host} в качестве options.

socket.connecting

Добавлено в: v6.1.0

Если true, socket.connect(options[, connectListener]) был вызван и еще не завершен. Он останется true до тех пор, пока сокет не будет подключен, затем он будет установлен в false, и будет отправлено событие 'connect'. Обратите внимание, что обратный вызов socket.connect(options[, connectListener]) является обработчиком события 'connect'.

socket.destroy([error])

Добавлен в: v0.1.90

Гарантирует, что на этом сокете больше не будет активности ввода-вывода. Уничтожает поток и закрывает соединение.

См. writable.destroy() для получения более подробной информации.

socket.destroyed

  • <boolean> Указывает, уничтожено ли соединение или нет. После уничтожения соединения никакие дальнейшие данные не могут быть переданы с его помощью.

См. writable.destroyed для получения более подробной информации.

socket.destroySoon()

Добавлен в: v0.3.4

Уничтожает сокет после записи всех данных. Если событие 'finish' уже было отправлено, сокет уничтожается немедленно. Если сокет всё ещё доступен для записи, он неявно вызывает socket.end().

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

Добавлен в: v0.1.90

  • data <string> | <Buffer> | <Uint8Array>
  • encoding <string> Используется только тогда, когда data — строка. По умолчанию: 'utf8'.
  • callback <Function> Необязательный обратный вызов после завершения работы сокета.
  • Возвращает: <net.Socket> Сам сокет.

Полузакрывает сокет. То есть отправляет пакет FIN. Возможно, сервер всё ещё будет отправлять некоторые данные.

См. writable.end() для получения более подробной информации.

socket.localAddress

Добавлен в: v0.9.6

Строковое представление локального IP-адреса, к которому подключается удалённый клиент. Например, на сервере, прослушивающем '0.0.0.0', если клиент подключается по '192.168.1.1', значение socket.localAddress будет '192.168.1.1'.

socket.localPort

Добавлен в: v0.9.6

Числовое представление локального порта. Например, 80 или 21.

socket.localFamily

Добавлен в: v18.8.0, v16.18.0

Строковое представление семейства локальных IP-адресов. 'IPv4' или 'IPv6'.

socket.pause()

Приостанавливает чтение данных. То есть события 'data' генерироваться не будут. Полезно для ограничения скорости загрузки.

socket.pending

Добавлен в: v11.2.0, v10.16.0

Имеет значение true, если сокет ещё не подключен, либо потому что .connect() ещё не был вызван, либо потому что он всё ещё находится в процессе подключения (см. socket.connecting).

socket.ref()

Добавлен в: v0.9.1

Противоположность unref(). Вызов ref() для ранее unrefed сокета не позволит программе завершиться, если это единственный оставшийся сокет (поведение по умолчанию). Если сокет уже refed, повторный вызов ref не будет иметь эффекта.

socket.remoteAddress

Добавлен в: v0.5.10

Строковое представление удалённого IP-адреса. Например, '74.125.127.100' или '2001:4860:a005::68'. Значение может быть undefined, если сокет уничтожен (например, если клиент отключился).

socket.remoteFamily

Добавлен в: v0.11.14

Строковое представление семейства удалённых IP-адресов. 'IPv4' или 'IPv6'. Значение может быть undefined, если сокет уничтожен (например, если клиент отключился).

socket.remotePort

Добавлен в: v0.5.10

Числовое представление удаленного порта. Например, 80 или 21. Значение может быть undefined, если сокет уничтожен (например, если клиент отключился).

socket.resetAndDestroy()

Добавлен в: v18.3.0, v16.17.0

Закрывает TCP-соединение, отправляя пакет RST, и уничтожает поток. Если этот TCP-сокет находится в состоянии подключения, он отправит пакет RST и уничтожит этот TCP-сокет после установления соединения. В противном случае он вызовет socket.destroy с ошибкой ERR_SOCKET_CLOSED. Если это не TCP-сокет (например, pipe), вызов этого метода немедленно вызовет ошибку ERR_INVALID_HANDLE_TYPE.

socket.resume()

Возобновляет чтение после вызова socket.pause().

socket.setEncoding([encoding])

Добавлен в: v0.1.90

Устанавливает кодировку для сокета как Readable Stream. См. readable.setEncoding() для получения дополнительной информации.

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

[История]

ВерсияИзменения
v13.12.0, v12.17.0Добавлены новые значения по умолчанию для параметров сокета TCP_KEEPCNT и TCP_KEEPINTVL.
v0.1.92Добавлено в: v0.1.92
  • enable <boolean> По умолчанию: false
  • initialDelay <number> По умолчанию: 0
  • Возвращает: <net.Socket> Сам сокет.

Включает/отключает функцию keep-alive и, при необходимости, устанавливает начальную задержку перед отправкой первого keepalive-запроса на неактивном сокете.

Установите initialDelay (в миллисекундах), чтобы установить задержку между последним полученным пакетом данных и первым keepalive-запросом. Установка 0 для initialDelay оставит значение без изменений по сравнению с настройкой по умолчанию (или предыдущей).

Включение функции keep-alive установит следующие параметры сокета:

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

socket.setNoDelay([noDelay])

Добавлен в: v0.1.90

Включает/отключает использование алгоритма Нэгла.

При создании TCP-соединения алгоритм Нэгла будет включен.

Алгоритм Нэгла задерживает данные перед отправкой по сети. Он пытается оптимизировать пропускную способность за счет увеличения задержки.

Передача true для noDelay или отсутствие аргумента отключат алгоритм Нэгла для сокета. Передача false для noDelay включит алгоритм Нэгла.

socket.setTimeout(timeout[, callback])

[История]

ВерсияИзменения
v18.0.0Передача недопустимого обратного вызова в аргумент callback теперь вызывает исключение ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v0.1.90Добавлено в: v0.1.90

Устанавливает тайм-аут сокета после timeout миллисекунд бездействия на сокете. По умолчанию net.Socket не имеет тайм-аута.

Когда срабатывает тайм-аут бездействия, сокет получает событие 'timeout', но соединение не разрывается. Пользователь должен вручную вызвать socket.end() или socket.destroy(), чтобы завершить соединение.

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

Если timeout равен 0, то существующий тайм-аут бездействия отключается.

Необязательный параметр callback будет добавлен как одноразовый обработчик для события 'timeout'.

socket.timeout

Добавлен в: v10.7.0

Тайм-аут сокета в миллисекундах, установленный с помощью socket.setTimeout(). Значение undefined, если тайм-аут не установлен.

socket.unref()

Добавлен в: v0.9.1

Вызов unref() для сокета позволит программе завершиться, если это единственный активный сокет в системе событий. Если сокет уже unrefed, повторный вызов unref() не будет иметь эффекта.

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

Добавлен в: v0.1.90

Отправляет данные по сокету. Второй параметр указывает кодировку в случае строки. По умолчанию используется кодировка UTF8.

Возвращает true, если все данные были успешно отправлены в буфер ядра. Возвращает false, если все или часть данных были помещены в очередь в пользовательской памяти. Событие 'drain' будет вызвано, когда буфер снова освободится.

Необязательный параметр callback будет выполнен, когда данные будут окончательно записаны, что может произойти не сразу.

См. метод write() потока Writable для получения дополнительной информации.

socket.readyState

Добавлено в: v0.5.0

Это свойство представляет состояние соединения как строку.

  • Если поток устанавливает соединение, socket.readyState равно opening.
  • Если поток доступен для чтения и записи, он имеет значение open.
  • Если поток доступен для чтения, но не для записи, он имеет значение readOnly.
  • Если поток недоступен ни для чтения, ни для записи, он имеет значение writeOnly.

net.connect()

Псевдоним для net.createConnection().

Возможные сигнатуры:

net.connect(options[, connectListener])

Добавлено в: v0.7.0

Псевдоним для net.createConnection(options[, connectListener]).

net.connect(path[, connectListener])

Добавлено в: v0.1.90

Псевдоним для net.createConnection(path[, connectListener]).

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

Добавлено в: v0.1.90

Псевдоним для net.createConnection(port[, host][, connectListener]).

net.createConnection()

Функция-фабрика, которая создаёт новый net.Socket, немедленно инициирует соединение с помощью socket.connect(), а затем возвращает net.Socket, который начинает соединение.

Когда соединение установлено, событие 'connect' будет испущено на возвращаемом сокете. Последний параметр connectListener, если предоставлен, будет добавлен в качестве обработчика события 'connect' один раз.

Возможные сигнатуры:

Функция net.connect() является псевдонимом этой функции.

net.createConnection(options[, connectListener])

Добавлено в: v0.1.90

Для доступных опций см. new net.Socket([options]) и socket.connect(options[, connectListener]).

Дополнительные опции:

  • timeout <number> Если задано, будет использовано для вызова socket.setTimeout(timeout) после создания сокета, но до начала соединения.

Ниже приведён пример клиента сервера эхо, описанного в разделе net.createServer():

js
import net from 'node:net'
const client = net.createConnection({ port: 8124 }, () => {
  // Обработчик события 'connect'.
  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'.
  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')
})

Для подключения к сокету /tmp/echo.sock:

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

Ниже приведён пример клиента, использующего опции port и onread. В этом случае опция onread будет использована только для вызова new net.Socket([options]), а опция port — для вызова socket.connect(options[, connectListener]).

js
import net from 'node:net'
import { Buffer } from 'node:buffer'
net.createConnection({
  port: 8124,
  onread: {
    // Повторно использует буфер размером 4 КБ для каждого чтения из сокета.
    buffer: Buffer.alloc(4 * 1024),
    callback: function (nread, buf) {
      // Полученные данные доступны в `buf` от 0 до `nread`.
      console.log(buf.toString('utf8', 0, nread))
    },
  },
})
js
const net = require('node:net')
net.createConnection({
  port: 8124,
  onread: {
    // Повторно использует буфер размером 4 КБ для каждого чтения из сокета.
    buffer: Buffer.alloc(4 * 1024),
    callback: function (nread, buf) {
      // Полученные данные доступны в `buf` от 0 до `nread`.
      console.log(buf.toString('utf8', 0, nread))
    },
  },
})

net.createConnection(path[, connectListener])

Добавлен в: v0.1.90

Инициирует IPC соединение.

Эта функция создает новый net.Socket со всеми параметрами, установленными по умолчанию, немедленно инициирует соединение с помощью socket.connect(path[, connectListener]), а затем возвращает net.Socket, который запускает соединение.

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

Добавлен в: v0.1.90

Инициирует TCP-соединение.

Эта функция создает новый net.Socket со всеми параметрами, установленными по умолчанию, немедленно инициирует соединение с помощью socket.connect(port[, host][, connectListener]), а затем возвращает net.Socket, который запускает соединение.

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

[История]

ВерсияИзменения
v20.1.0, v18.17.0Теперь поддерживается параметр highWaterMark.
v17.7.0, v16.15.0Теперь поддерживаются параметры noDelay, keepAlive и keepAliveInitialDelay.
v0.5.0Добавлено в: v0.5.0
  • options <Object>

    • allowHalfOpen <boolean> Если установлено в false, то сокет автоматически закроет сторону записи, когда закончится сторона чтения. По умолчанию: false.
    • highWaterMark <number> Дополнительно переопределяет readableHighWaterMark и writableHighWaterMark всех net.Socket. По умолчанию: См. stream.getDefaultHighWaterMark().
    • keepAlive <boolean> Если установлено в true, то включает функциональность keep-alive на сокете сразу после получения нового входящего соединения, аналогично тому, что делается в socket.setKeepAlive(). По умолчанию: false.
    • keepAliveInitialDelay <number> Если установлено в положительное число, то устанавливает начальную задержку перед отправкой первого зонда keepalive на неактивном сокете. По умолчанию: 0.
    • noDelay <boolean> Если установлено в true, то отключает использование алгоритма Нагла сразу после получения нового входящего соединения. По умолчанию: false.
    • pauseOnConnect <boolean> Указывает, следует ли приостанавливать сокет при входящих соединениях. По умолчанию: false.
    • blockList <net.BlockList> blockList может использоваться для отключения входящего доступа к определенным IP-адресам, диапазонам IP-адресов или IP-подсетям. Это не работает, если сервер находится за обратным прокси-сервером, NAT и т.д., потому что адрес, проверяемый на соответствие списку блокировки, — это адрес прокси-сервера или адрес, указанный NAT.
  • connectionListener <Function> Автоматически устанавливается как прослушиватель события 'connection'.

  • Возвращает: <net.Server>

Создает новый TCP или IPC сервер.

Если allowHalfOpen установлено в true, когда другой конец сокета сигнализирует о завершении передачи, сервер отправит обратно завершение передачи только тогда, когда будет явно вызван socket.end(). Например, в контексте TCP, когда получен пакет FIN, пакет FIN отправляется обратно только тогда, когда явно вызывается socket.end(). До этого момента соединение является полузакрытым (нечитаемым, но записываемым). См. событие 'end' и RFC 1122 (раздел 4.2.2.13) для получения дополнительной информации.

Если pauseOnConnect установлено в true, то сокет, связанный с каждым входящим соединением, будет приостановлен, и данные не будут считываться из его дескриптора. Это позволяет передавать соединения между процессами без считывания каких-либо данных исходным процессом. Чтобы начать чтение данных из приостановленного сокета, вызовите socket.resume().

Сервер может быть TCP-сервером или IPC сервером в зависимости от того, к чему он listen().

Вот пример TCP-эхо-сервера, который прослушивает соединения на порту 8124:

js
import net from 'node:net'
const server = net.createServer(c => {
  // Прослушиватель 'connection'.
  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'.
  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')
})

Проверьте это с помощью telnet:

bash
telnet localhost 8124

Для прослушивания сокета /tmp/echo.sock:

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

Используйте nc для подключения к серверу сокета домена Unix:

bash
nc -U /tmp/echo.sock

net.getDefaultAutoSelectFamily()

Добавлено в: v19.4.0

Возвращает текущее значение по умолчанию параметра autoSelectFamily для socket.connect(options). Начальное значение по умолчанию — true, если не указан параметр командной строки --no-network-family-autoselection.

  • Возвращает: <boolean> Текущее значение по умолчанию параметра autoSelectFamily.

net.setDefaultAutoSelectFamily(value)

Добавлено в: v19.4.0

Устанавливает значение по умолчанию параметра autoSelectFamily для socket.connect(options).

  • value <boolean> Новое значение по умолчанию. Начальное значение по умолчанию — true, если не указан параметр командной строки --no-network-family-autoselection.

net.getDefaultAutoSelectFamilyAttemptTimeout()

Добавлено в: v19.8.0, v18.18.0

Возвращает текущее значение по умолчанию параметра autoSelectFamilyAttemptTimeout для socket.connect(options). Начальное значение по умолчанию — 250 или значение, указанное с помощью параметра командной строки --network-family-autoselection-attempt-timeout.

  • Возвращает: <number> Текущее значение по умолчанию параметра autoSelectFamilyAttemptTimeout.

net.setDefaultAutoSelectFamilyAttemptTimeout(value)

Добавлено в: v19.8.0, v18.18.0

Устанавливает значение по умолчанию параметра autoSelectFamilyAttemptTimeout для socket.connect(options).

  • value <number> Новое значение по умолчанию, которое должно быть положительным числом. Если число меньше 10, используется значение 10. Начальное значение по умолчанию — 250 или значение, указанное с помощью параметра командной строки --network-family-autoselection-attempt-timeout.

net.isIP(input)

Добавлено в: v0.3.0

Возвращает 6, если input — это адрес IPv6. Возвращает 4, если input — это адрес IPv4 в точечно-десятичной записи без ведущих нулей. В противном случае возвращает 0.

js
net.isIP('::1') // возвращает 6
net.isIP('127.0.0.1') // возвращает 4
net.isIP('127.000.000.001') // возвращает 0
net.isIP('127.0.0.1/24') // возвращает 0
net.isIP('fhqwhgads') // возвращает 0

net.isIPv4(input)

Добавлено в: v0.3.0

Возвращает true, если input — это адрес IPv4 в точечно-десятичной записи без ведущих нулей. В противном случае возвращает false.

js
net.isIPv4('127.0.0.1') // возвращает true
net.isIPv4('127.000.000.001') // возвращает false
net.isIPv4('127.0.0.1/24') // возвращает false
net.isIPv4('fhqwhgads') // возвращает false

net.isIPv6(input)

Добавлено в: v0.3.0

Возвращает true, если input — это адрес IPv6. В противном случае возвращает false.

js
net.isIPv6('::1') // возвращает true
net.isIPv6('fhqwhgads') // возвращает false