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 domain socket, имя возвращается в виде строки.

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

[Stable: 1 - Experimental]

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

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

server.getConnections(callback)

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

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

Callback должен принимать два аргумента 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('Address in use, retrying...');
    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> functions.

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

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

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

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

Когда exclusive имеет значение true и базовый handle является общим, возможно, что несколько workers запрашивают handle с различными backlogs. В этом случае будет использован первый 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 endpoint (использует именованные каналы в 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> Сигнал Abort, который можно использовать для уничтожения сокета.

    • 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().

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

Событие: '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

[Stable: 0 - Deprecated]

Stable: 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() hints.
  • host <string> Хост, к которому должен подключиться сокет. По умолчанию: 'localhost'.
  • keepAlive <boolean> Если установлено значение true, это включает функцию поддержания активности (keep-alive) на сокете сразу после установления соединения, аналогично тому, что делается в socket.setKeepAlive(). По умолчанию: false.
  • keepAliveInitialDelay <number> Если установлено положительное число, оно устанавливает начальную задержку перед отправкой первого зонда keepalive на неактивном сокете. По умолчанию: 0.
  • localAddress <string> Локальный адрес, с которого должен подключиться сокет.
  • localPort <number> Локальный порт, с которого должен подключиться сокет.
  • lookup <Function> Пользовательская функция lookup. По умолчанию: dns.lookup().
  • noDelay <boolean> Если установлено значение true, это отключает использование алгоритма Нагла сразу после установления сокета. По умолчанию: false.
  • port <number> Обязательно. Порт, к которому должен подключиться сокет.
  • blockList <net.BlockList> blockList можно использовать для отключения исходящего доступа к определенным IP-адресам, диапазонам IP-адресов или IP-подсетям.

Для IPC подключений доступны следующие options:

  • path <string> Обязательно. Путь, к которому должен подключиться клиент. См. Identifying paths for IPC connections. Если указано, параметры, специфичные для TCP, указанные выше, игнорируются.

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 является string. По умолчанию: '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-сокет (например, канал), вызов этого метода немедленно вызовет ошибку 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() на сокете позволит программе завершиться, если это единственный активный сокет в системе событий. Если для сокета уже вызван unref, повторный вызов 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' listener.
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});
js
const net = require('node:net');
const client = net.createConnection({ port: 8124 }, () => {
  // 'connect' listener.
  console.log('connected to server!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});

Чтобы подключиться к сокету /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: {
    // Reuses a 4KiB Buffer for every read from the socket.
    buffer: Buffer.alloc(4 * 1024),
    callback: function(nread, buf) {
      // Received data is available in `buf` from 0 to `nread`.
      console.log(buf.toString('utf8', 0, nread));
    },
  },
});
js
const net = require('node:net');
net.createConnection({
  port: 8124,
  onread: {
    // Reuses a 4KiB Buffer for every read from the socket.
    buffer: Buffer.alloc(4 * 1024),
    callback: function(nread, buf) {
      // Received data is available in `buf` from 0 to `nread`.
      console.log(buf.toString('utf8', 0, nread));
    },
  },
});

net.createConnection(path[, connectListener])

Added in: v0.1.90

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

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

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

Added in: 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 echo-сервера, который прослушивает соединения на порту 8124:

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

Протестируйте это с помощью 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