On this page

网络

History
Source Code: lib/net.js

稳定性:2 - 稳定

node:net 模块提供了一个异步网络 API,用于创建基于流的 TCP 或 IPC 服务器(net.createServer())和客户端 (net.createConnection())。

可以使用以下方式访问它:

node:net 模块在 Windows 上支持使用命名管道进行 IPC,在其他 操作系统上支持 Unix 域套接字。

net.connect()net.createConnection()server.listen()socket.connect() 接受一个 path 参数来识别 IPC 端点。

在 Unix 上,本地域也称为 Unix 域。路径是一个 文件系统路径名。当路径名的长度 大于 sizeof(sockaddr_un.sun_path) 的长度时,它将抛出错误。典型值在 Linux 上为 107 字节,在 macOS 上为 103 字节。如果 Node.js API 抽象创建 了 Unix 域套接字,它也会取消链接该 Unix 域套接字。例如,net.createServer() 可能创建一个 Unix 域套接字,而 server.close() 将取消链接它。但是如果用户在这些抽象之外创建 Unix 域 套接字,用户将需要手动移除它。当 Node.js API 创建 Unix 域套接字但程序随后 崩溃时,同样适用。简而言之,Unix 域套接字将在文件系统中可见,并且 将持续存在直到被取消链接。在 Linux 上,你可以通过在路径开头添加 \0 来使用 Unix 抽象套接字,例如 \0abstract。Unix 抽象套接字的路径 在文件系统中不可见,并且当所有对套接字的开放引用关闭时它将自动消失。

在 Windows 上,本地域是使用命名管道实现的。路径 必须 引用 \\?\pipe\\\.\pipe\ 中的条目。允许使用任何字符, 但后者可能会对管道名称进行一些处理,例如解析 .. 序列。尽管它看起来可能如何,管道命名空间是扁平的。管道将 不会持久存在。当对它们的最后一个引用关闭时,它们会被移除。 与 Unix 域套接字不同,当拥有进程退出时,Windows 将关闭并移除管道。

JavaScript 字符串转义要求路径使用额外的反斜杠转义来指定,例如:

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

类:net.BlockList

History

BlockList 对象可与某些网络 API 一起使用,以指定规则 阻止对特定 IP 地址、IP 范围或 IP 子网的入站或出站访问。

M

blockList.addAddress

History
blockList.addAddress(address, type?): void
Attributes
一个 IPv4 或 IPv6 地址。
type:string
'ipv4''ipv6'默认: 'ipv4'

添加一条规则以阻止给定的 IP 地址。

M

blockList.addAddresses

History
blockList.addAddresses(addresses, type?): void
Attributes
addresses:string[] | net.SocketAddress[]
IPv4 或 IPv6 地址数组。
type:string
'ipv4''ipv6'默认: 'ipv4'

在单次操作中向阻止列表添加多条地址规则。

当添加大量单独地址时,这比反复调用 blockList.addAddress() 更高效,因为这些地址会在一次内部锁获取期间插入。

M

blockList.addCIDR

History
blockList.addCIDR(cidr): void
Attributes
cidr:string
使用 CIDR 表示法表示的 IPv4 或 IPv6 子网(例如 '10.0.0.0/8''2001:db8::/32' )。

使用 CIDR 表示法添加一条子网规则。地址族会根据地址自动检测(如果地址包含 ':' 则为 IPv6,否则为 IPv4)。这等价于使用解析后的网络地址、 前缀长度和地址族调用 blockList.addSubnet()

M

blockList.addCIDRs

History
blockList.addCIDRs(cidrs): void
Attributes
cidrs:string[]
使用 CIDR 表示法表示的 IPv4 或 IPv6 子网数组。

在一次调用中使用 CIDR 表示法添加多条子网规则。每个条目的地址族都会自动检测。 这等价于对数组中的每个元素调用 blockList.addCIDR()

M

blockList.addRange

History
blockList.addRange(start, end, type?): void
Attributes
范围中的起始 IPv4 或 IPv6 地址。
范围中的结束 IPv4 或 IPv6 地址。
type:string
'ipv4''ipv6'默认: 'ipv4'

添加一条规则以阻止从 start(包含)到 end(包含)的 IP 地址范围。

M

blockList.addSubnet

History
blockList.addSubnet(net, prefix, type?): void
Attributes
网络 IPv4 或 IPv6 地址。
prefix:number
CIDR 前缀位数。对于 IPv4,此 值必须在 032 之间。对于 IPv6,此值必须在 0128 之间。
type:string
'ipv4''ipv6'默认: 'ipv4'

添加一条规则以阻止指定为子网掩码的 IP 地址范围。

M

blockList.check

History
blockList.check(address, type?): void
Attributes
要检查的 IP 地址
type:string
'ipv4''ipv6'默认: 'ipv4'

如果给定的 IP 地址匹配添加到 BlockList 的任何规则,则返回 true

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

// IPv4 地址的 IPv6 表示法有效:
console.log(blockList.check('::ffff:7b7b:7b7b', 'ipv6')); // 输出:true
console.log(blockList.check('::ffff:123.123.123.123', 'ipv6')); // 输出:true
blockList.clear(): void

清除 BlockList 中的所有规则。

blockList.fromJSON(value): void

稳定性:1.2 - 候选发布

const blockList = new net.BlockList();
const data = [
  'Subnet: IPv4 192.168.1.0/24',
  'Address: IPv4 10.0.0.5',
  'Range: IPv4 192.168.2.1-192.168.2.10',
  'Range: IPv4 10.0.0.1-10.0.0.10',
];
blockList.fromJSON(data);
blockList.fromJSON(JSON.stringify(data));
  • value Blocklist.rules
M

BlockList.isBlockList

History
BlockList.isBlockList(value): void
Attributes
value:any
任意 JS 值
P

BlockList.PRIVATE_RANGES

History

一个冻结的 CIDR 字符串数组,表示私有、回环和链路本地 IP 地址范围。可以将其传递给 blockList.addCIDRs(),以快速将所有不可路由的地址范围添加到阻止列表中。

包含的范围如下:

  • 10.0.0.0/8 — RFC 1918 私有 IPv4
  • 172.16.0.0/12 — RFC 1918 私有 IPv4
  • 192.168.0.0/16 — RFC 1918 私有 IPv4
  • 127.0.0.0/8 — IPv4 回环
  • ::1/128 — IPv6 回环
  • 169.254.0.0/16 — IPv4 链路本地
  • fe80::/10 — IPv6 链路本地
  • fc00::/7 — IPv6 唯一本地地址(ULA)
const blockList = new net.BlockList();
blockList.addCIDRs(net.BlockList.PRIVATE_RANGES);

console.log(blockList.check('10.0.0.1'));      // 输出:true
console.log(blockList.check('127.0.0.1'));     // 输出:true
console.log(blockList.check('8.8.8.8'));       // 输出:false
M

blockList.removeAddress

History
blockList.removeAddress(address, type?): void
Attributes
一个 IPv4 或 IPv6 地址。
type:string
'ipv4''ipv6'默认: 'ipv4'

移除之前通过 blockList.addAddress() 添加的规则。 地址必须与添加规则时使用的值完全匹配。如果指定的地址不存在,则不执行任何操作。

M

blockList.removeCIDR

History
blockList.removeCIDR(cidr): void
Attributes
cidr:string
使用 CIDR 表示法表示的 IPv4 或 IPv6 子网(例如 '10.0.0.0/8''2001:db8::/32' )。

使用 CIDR 表示法移除一条子网规则。地址族会根据地址自动检测。 这等价于使用解析后的网络地址、前缀长度和地址族调用 blockList.removeSubnet()。如果指定的子网不存在,则不执行任何操作。

M

blockList.removeRange

History
blockList.removeRange(start, end, type?): void
Attributes
范围中的起始 IPv4 或 IPv6 地址。
范围中的结束 IPv4 或 IPv6 地址。
type:string
'ipv4''ipv6'默认: 'ipv4'

移除之前通过 blockList.addRange() 添加的规则。startend 地址必须与添加规则时使用的值完全匹配。 如果指定的范围不存在,则不执行任何操作。

M

blockList.removeSubnet

History
blockList.removeSubnet(net, prefix, type?): void
Attributes
网络 IPv4 或 IPv6 地址。
prefix:number
CIDR 前缀位数。对于 IPv4,此 值必须在 032 之间。对于 IPv6,此值必须在 0128 之间。
type:string
'ipv4''ipv6'默认: 'ipv4'

移除之前通过 blockList.addSubnet() 添加的规则。 网络地址和前缀必须与添加规则时使用的值完全匹配。 如果指定的子网不存在,则不执行任何操作。

P

blockList.rules

History

添加到阻止列表中的规则列表。

P

blockList.size

History

阻止列表中的规则数量。这等价于 blockList.rules.length,但不会分配规则数组。

blockList.toJSON(): void

稳定性:1.2 - 候选发布

  • 返回 Blocklist.rules。

类:net.SocketAddress

History
C

net.SocketAddress Constructor

History
new net.SocketAddress(options?): void
Attributes
options:Object
address:string
网络地址,可以是 IPv4 或 IPv6 字符串。 默认 :如果 family'ipv4' 则为 '127.0.0.1' ;如果 family'ipv6' 则为 '::'
family:string
'ipv4''ipv6' 之一。 默认'ipv4'
flowlabel:number
IPv6 流标签,仅当 family'ipv6' 时使用。
port:number
IP 端口。
P

socketaddress

History
P

socketaddress.family

History
  • 类型:string 'ipv4''ipv6'
P

socketaddress.flowlabel

History
P

socketaddress.port

History
M

SocketAddress.parse

History
SocketAddress.parse(input): void
Attributes
input:string
一个包含 IP 地址和可选端口的输入字符串, 例如 123.1.2.3:1234[1::1]:1234

类:net.Server

History

此类用于创建 TCP 或 IPC 服务器。

一个正在监听的 TCP net.Server 可以通过将其列入 worker_threadspostMessage() 调用中的 transferList,转移到工作线程。 这会将底层监听套接字移到接收线程,在那里它会继续 接受连接。参见 [将 TCP 句柄转移到其他线程][]。

new net.Server(options?, connectionListener?): void
Attributes
connectionListener:Function
自动设置为 'connection' 事件的监听器。

net.Server 是一个 EventEmitter,具有以下事件:

事件:'close'

History

当服务器关闭时触发。如果存在连接,则在所有连接都结束之前不会触发此事件。

事件:'connection'

History

当建立新连接时触发。socketnet.Socket 的一个实例。

事件:'error'

History

当发生错误时触发。不同于 net.Socket'close' 事件不会在此事件之后直接触发,除非手动调用 server.close()。请参见 server.listen() 讨论中的示例。

事件:'listening'

History

在调用 server.listen() 后,服务器完成绑定时触发。

事件:'drop'

History

当连接数达到 server.maxConnections 的阈值时,服务器将丢弃新的连接,并改为触发 'drop' 事件。如果它是 TCP 服务器,参数如下;否则参数为 undefined

Attributes
data:Object
传递给事件监听器的参数。
localAddress:string
本地地址。
localPort:number
本地端口。
localFamily:string
本地族。
remoteAddress:string
远程地址。
remotePort:number
远程端口。
remoteFamily:string
远程 IP 族。 'IPv4''IPv6'
server.address(): void

返回已绑定的 address、地址的 family 名称,以及服务器的 port,如果在 IP 套接字上监听,则由操作系统报告(在获取操作系统分配的地址时很有用):{ port: 12346, family: 'IPv4', address: '127.0.0.1' }

对于监听管道或 Unix 域套接字的服务器,名称以字符串形式返回。

const server = net.createServer((socket) => {
  socket.end('goodbye\n');
}).on('error', (err) => {
  // 在这里处理错误。
  throw err;
});

// 获取一个任意未使用的端口。
server.listen(() => {
  console.log('opened server on', server.address());
});

'listening' 事件被发出之前或在调用 server.close() 之后,server.address() 会返回 null

M

server.close

History
server.close(callback?): void
Attributes
callback:Function
在服务器关闭时调用。

停止服务器接受新连接,并保留现有连接。此函数是异步的,当所有连接都结束且服务器发出 'close' 事件时,服务器最终会关闭。可选的 callback 会在 'close' 事件发生后被调用。与该事件不同的是,如果服务器在关闭时并未处于打开状态,它将以一个 Error 作为唯一参数被调用。

M

server[Symbol.asyncDispose]

History
server[Symbol.asyncDispose](): void

调用 server.close() 并返回一个 promise,该 promise 会在服务器关闭时完成。

M

server[Symbol.asyncIterator]

History
server[Symbol.asyncIterator](): void

稳定性:1 - 实验性

返回一个用于迭代服务器传入连接的异步迭代器,使其可以使用 for await...of 进行消费,作为 'connection' 事件的替代方案。当服务器发出 'close' 事件时,迭代结束;当服务器发出 'error' 事件时,迭代将被拒绝。

只有在当前迭代的主体完成等待后,循环才会继续处理下一个连接,因此连接处理应分派到单独的异步任务中,而不应直接内联等待。否则,连接将被串行处理:每个连接都要等待前一个连接被完全处理。

import { createServer } from 'node:net';

const server = createServer().listen(8124);

async function handleConnection(socket) {
  // ...处理连接,并按需等待。
  socket.end('hello world!');
}

for await (const socket of server) {
  // 将处理分派到单独的任务中,使循环继续接受连接,
  // 而不是将它们串行处理。
  handleConnection(socket);
}

循环主体运行期间,服务器不会停止接受连接,因此处理速度低于连接速率的消费者可能会无限制地缓存连接。使用 server.maxConnections 来限制并发数。

M

server.getConnections

History
server.getConnections(callback): void
Attributes
callback:Function

异步获取服务器上的并发连接数。当套接字被发送到子进程时也能正常工作。

回调应接受两个参数 errcount

server.listen(): void

启动一个监听连接的服务器。net.Server 可以是 TCP 或 IPC 服务器,具体取决于它监听的内容。

可能的签名:

此函数是异步的。当服务器开始监听时,将发出 'listening' 事件。最后一个参数 callback 将被添加为 'listening' 事件的监听器。

所有 listen() 方法都可以接受一个 backlog 参数,用于指定待处理连接队列的最大长度。实际长度将由操作系统通过 sysctl 设置决定,例如 Linux 上的 tcp_max_syn_backlogsomaxconn。该参数的默认值为 511(不是 512)。

所有 net.Socket 都会被设置为 SO_REUSEADDR(详情请参见 socket(7))。

只有在第一次 server.listen() 调用期间发生错误,或者已经调用了 server.close() 时,才可以再次调用 server.listen() 方法。否则会抛出一个 ERR_SERVER_ALREADY_LISTEN 错误。

监听时最常见的错误之一是 EADDRINUSE。当另一台服务器已经在请求的 port/path/handle 上监听时,就会发生这种情况。处理此问题的一种方法是在一段时间后重试:

server.on('error', (e) => {
  if (e.code === 'EADDRINUSE') {
    console.error('地址正在使用中,正在重试...');
    setTimeout(() => {
      server.close();
      server.listen(PORT, HOST);
    }, 1000);
  }
});
M

server.listen

History
server.listen(handle, backlog?, callback?): void
Attributes
handle:Object
backlog:number
server.listen() 函数的通用参数
callback:Function

在已绑定到端口、Unix 域套接字或 Windows 命名管道的给定 handle 上启动服务器监听连接。

handle 对象可以是服务器、套接字(任何具有底层 _handle 成员的对象)、BoundSocket,或者带有有效文件描述符的 fd 成员的对象。

handleBoundSocket 时,服务器会接管该已绑定的 套接字并开始在其上监听。接管会消耗该已绑定套接字(参见 所有权转移)。

在 Windows 上不支持监听文件描述符。

server.listen(options, callback?): void
Attributes
options:Object
必需。支持以下属性:
backlog:number
server.listen() 函数的通用参数。
exclusive:boolean
默认值: false
预先绑定的 BoundSocket 。服务器会接管 该已绑定套接字并在其上监听,同时忽略 hostportpath 。接管会消耗该已绑定套接字(参见 所有权转移 )。
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
可用于关闭正在监听的 服务器的 AbortSignal。
writableAll:boolean
对于 IPC 服务器,使管道对所有用户 可写。 默认值: false
callback:Function
函数。

如果指定了 handle,服务器会接管该预绑定套接字。否则,如果 指定了 port,其行为与 server.listen([port[, host[, backlog]]][, callback]) 相同。 否则,如果指定了 path,其行为与 server.listen(path[, backlog][, callback]) 相同。 如果都未指定,则会抛出错误。

如果 exclusivefalse(默认值),则集群工作进程将使用相同的 底层句柄,从而允许共享连接处理职责。当 exclusivetrue 时,句柄不会共享,且尝试共享端口 会导致错误。下面展示了一个在独占端口上监听的示例。

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

exclusive 处于 true 状态且底层句柄为共享时, 可能会出现多个工作进程使用不同的 backlog 查询同一个句柄的情况。 在这种情况下,将使用传递给主进程的第一个 backlog

以 root 身份启动 IPC 服务器可能会导致无特权用户无法访问服务器路径。 使用 readableAllwritableAll 将使所有用户都可以访问该服务器。

如果启用了 signal 选项,在对应的 AbortController 上调用 .abort() 类似于在服务器上调用 .close()

const controller = new AbortController();
server.listen({
  host: 'localhost',
  port: 80,
  signal: controller.signal,
});
// 稍后,当你想关闭服务器时。
controller.abort();
M

server.listen

History
server.listen(path, backlog?, callback?): void
Attributes
path:string
服务器应监听的路径。参见 识别 IPC 连接的路径
backlog:number
server.listen() 函数的公共参数。
callback:Function
.

启动一个 IPC 服务器,在给定的 path 上监听连接。

M

server.listen

History
server.listen(port?, host?, backlog?, callback?): void
Attributes
port:number
host:string
backlog:number
server.listen() 函数的公共参数。
callback:Function
.

启动一个 TCP 服务器,在给定的 porthost 上监听连接。

如果未省略 port 或其值为 0,操作系统将分配一个任意的 未使用端口,可在发出 'listening' 事件后使用 server.address().port 获取该端口。

如果未省略 host,服务器将在 未指定的 IPv6 地址::)可用时接受连接, 否则将在 未指定的 IPv4 地址0.0.0.0)上接受连接。

在大多数操作系统中,监听 未指定的 IPv6 地址::) 可能会导致 net.Server 也监听 未指定的 IPv4 地址0.0.0.0)。

P

server.listening

History
  • 类型:boolean 指示服务器当前是否正在监听连接。

当连接数达到 server.maxConnections 阈值时:

  1. 如果进程未在集群模式下运行,Node.js 将关闭该连接。

  2. 如果进程在集群模式下运行,Node.js 默认会将该连接路由到另一个工作进程。若要改为关闭连接,请将 server.dropMaxConnection 设置为 true

不建议在套接字已通过 child_process.fork() 发送给子进程后再使用此选项。

P

server.dropMaxConnection

History

将此属性设置为 true,以便在连接数达到 server.maxConnections 阈值后开始关闭连接。此设置仅在集群模式下有效。

M

server.ref

History
server.ref(): void

unref() 相反,在之前已 unref 的服务器上调用 ref()不会 让程序在它是唯一剩余服务器时退出(默认行为)。 如果服务器已 ref,再次调用 ref() 将没有效果。

M

server.unref

History
server.unref(): void

在服务器上调用 unref() 将允许程序在它是事件系统中唯一 活动服务器时退出。如果服务器已经 unref,再次调用 unref() 将没有效果。

类:net.Socket

History

此类是 TCP 套接字或流式 IPC 端点(在 Windows 上使用命名管道,在其他系统上使用 Unix 域套接字)的抽象。它同时也是 EventEmitter

用户可以创建 net.Socket,并直接使用它与服务器进行交互。例如,net.createConnection() 会返回该对象,因此用户可以使用它与服务器通信。

Node.js 也可以创建该对象,并在接收到连接时将其传递给用户。例如,它会被传递给 net.Server 上触发的 'connection' 事件的监听器,因此用户可以使用它与客户端进行交互。

一个已连接的 TCP net.Socket 可以通过将其列入 worker_threadspostMessage() 调用的 transferList 中,移动到另一个线程。传输后,源 socket 会在发送线程上被销毁(后续使用会失败并返回 ERR_STREAM_DESTROYED,而不是静默丢弃数据),并且该 socket 会继续在接收线程上工作。这使得可以在一个线程上接受连接,然后将它们分发到一个 worker 线程池中,例如在 worker 线程之上构建类似 node:cluster 的模型。

该 socket 必须是刚刚接受或创建的 TCP 连接:它仍必须附加到一个活动句柄上,不能处于连接中或已销毁状态,也不能已经开始读取或包含缓冲数据。否则,postMessage() 会抛出 ERR_WORKER_HANDLE_NOT_TRANSFERABLE。目前仅支持 TCP socket。

const net = require('node:net');
const { Worker } = require('node:worker_threads');

// worker.js 接收 `{ socket }` 消息并处理每个连接。
const worker = new Worker('./worker.js');

const server = net.createServer((socket) => {
  // 将新接受的连接交给 worker 线程。
  worker.postMessage({ socket }, [socket]);
});
server.listen(8000);

监听中的 net.Server 也可以用相同的方式传递,这会将监听 socket 本身(以及其待处理的 accept 队列)移动到接收线程。

new net.Socket(options?): void
Attributes
options:Object
可用选项如下:
allowHalfOpen:boolean
如果设置为 false ,则当可读端结束时,套接字将自动结束可写端。详情请参见 net.createServer()'end' 事件。 默认值: false
blockList:net.BlockList
blockList 可用于禁用对特定 IP 地址、IP 范围或 IP 子网的出站访问。
如果指定,则使用给定的文件描述符包装现有套接字,否则将创建一个新套接字。
如果指定,则包装来自 BoundSocket 的已绑定套接字。随后对 socket.connect() 的调用会将已绑定套接字用作连接的源绑定(遵循已绑定的本地地址和端口)。 采用会消耗该已绑定套接字(参见 所有权转移 )。
keepAlive:boolean
如果设置为 true ,则会在连接建立后立即在套接字上启用保活功能,类似于 socket.setKeepAlive() 中的做法。 默认值: false
keepAliveInitialDelay:number
如果设置为正数,则会设置在空闲套接字上发送第一个保活探测前的初始延迟。 默认值: 0
noDelay:boolean
如果设置为 true ,则会在套接字建立后立即禁用 Nagle 算法。 默认值: false
onread:Object
如果指定,则传入数据会存储在单个 buffer 中,并在数据到达套接字时传递给提供的 callback 。这将导致流式功能不提供任何数据。 套接字仍会像往常一样发出 'error''end''close' 等事件。 pause()resume() 等方法也会按预期运行。
用于存储传入数据的可重用内存块,或者返回此类内存块的函数。
callback:Function
每当有传入数据块时都会调用此函数。会向其传递两个参数:写入 buffer 的字节数,以及对 buffer 的引用。从此函数返回 false 可隐式 pause() 套接字。此函数将在全局上下文中执行。
readable:boolean
当传入 fd 时,允许在套接字上进行读取,否则忽略。 默认值: false
可用于销毁套接字的中止信号。
typeOfService:number
初始服务类型(TOS)值。
writable:boolean
当传入 fd 时,允许在套接字上进行写入,否则忽略。 默认值: false

创建一个新的套接字对象。

新创建的套接字可以是 TCP 套接字或流式 IPC 端点,具体取决于它 connect() 到什么。

事件:'close'

History
Attributes
hadError:boolean
如果 Socket 发生传输错误则为 true

在 Socket 完全关闭后发出。参数 hadError 是一个布尔值,表示 Socket 是否因传输错误而关闭。

事件:'connect'

History

在 Socket 连接成功建立时发出。 详见 net.createConnection().

事件:'connectionAttempt'

History
Attributes
Socket 尝试连接的 IP。
port:number
Socket 尝试连接的端口。
family:number
IP 的族。对于 IPv6 可以是 6 ,对于 IPv4 可以是 4

在新的连接尝试启动时发出。如果在 socket.connect(options) 中启用了族自动选择算法,则可能会多次发出此事件。

事件:'connectionAttemptFailed'

History
Attributes
Socket 尝试连接的 IP。
port:number
Socket 尝试连接的端口。
family:number
IP 的族。对于 IPv6 可以是 6 ,对于 IPv4 可以是 4
error:Error
与失败相关的错误。

在连接尝试失败时发出。如果在 socket.connect(options) 中启用了族自动选择算法,则可能会多次发出此事件。

事件:'connectionAttemptTimeout'

History
Attributes
Socket 尝试连接的 IP。
port:number
Socket 尝试连接的端口。
family:number
IP 的族。对于 IPv6 可以是 6 ,对于 IPv4 可以是 4

在连接尝试超时时发出。仅当在 socket.connect(options) 中启用了族自动选择算法时才会发出此事件(并且可能会多次发出)。

事件:'data'

History

在收到数据时发出。参数 data 将是 BufferString。数据的编码由 socket.setEncoding() 设置。

如果 Socket 发出 'data' 事件时没有监听器,数据将会丢失。

事件:'drain'

History

在写入缓冲区变为空时发出。可用于限制上传。

另见:socket.write() 的返回值。

事件:'end'

History

当 Socket 的另一端信号传输结束时发出,从而结束 Socket 的可读端。

默认情况下(allowHalfOpenfalse),Socket 将发送一个传输结束包,并在写出其待处理的写入队列后销毁其文件描述符。但是,如果 allowHalfOpen 设置为 true,则 Socket 不会自动 end() 其可写端,允许用户写入任意数量的数据。用户必须显式调用 end() 来关闭连接(即发送一个 FIN 包回来)。

事件:'error'

History

在发生错误时发出。'close' 事件将在此事件之后直接调用。

在解析主机名之后但在连接之前发出。
不适用于 Unix 套接字。

Attributes
err:Error | null
错误对象。详见 dns.lookup()
address:string
IP 地址。
family:number | null
地址类型。详见 dns.lookup()
host:string
主机名。

事件:'ready'

History

在 Socket 准备好使用时发出。

'connect' 之后立即触发。

事件:'timeout'

History

如果 Socket 因不活动而超时时发出。这仅用于通知 Socket 处于空闲状态。用户必须手动关闭连接。

另见:socket.setTimeout()

socket.address(): void

返回操作系统报告的套接字绑定的 address、地址 family 名称和 port{ port: 12346, family: 'IPv4', address: '127.0.0.1' }

P

socket.autoSelectFamilyAttemptedAddresses

History

仅当在 socket.connect(options) 中启用了族自动选择算法时,此属性才存在,它是已尝试地址的数组。

每个地址都是 $IP:$PORT 形式的字符串。如果连接成功,则最后一个地址是 Socket 当前连接的地址。

P

socket.bufferSize

History

稳定性:0 - 已废弃:改用 writable.writableLength

此属性显示用于写入的缓冲字符数。缓冲区可能包含编码后长度未知的字符串。因此,这个数字只是缓冲区中字节数的近似值。

net.Socket 具有 socket.write() 始终有效的属性。这是为了帮助用户快速上手。计算机无法总是跟上写入 Socket 的数据量。网络连接可能只是太慢。Node.js 将在内部队列化写入 Socket 的数据,并在可能时通过线路发送出去。

此内部缓冲的后果是内存可能会增长。遇到大型或不断增长的 bufferSize 的用户应尝试使用 socket.pause()socket.resume() 在其程序中“限制”数据流。

P

socket.bytesRead

History
  • 类型:整数

接收的字节数。

P

socket.bytesWritten

History

发送的字节数。

socket.connect(): void

在给定的 Socket 上发起连接。

可能的签名:

此函数是异步的。当连接建立时,将发出 'connect' 事件。如果连接有问题,将发出 'error' 事件而不是 'connect' 事件,错误将传递给 'error' 监听器。 最后一个参数 connectListener,如果提供,将作为 'connect' 事件的监听器添加一次

此函数仅应用于在发出 'close' 后重新连接 Socket,否则可能导致未定义的行为。

socket.connect(options, connectListener?): void
Attributes
options:Object
connectListener:Function
socket.connect() 方法的通用参数。将作为 'connect' 事件的监听器添加一次。

在给定的 Socket 上发起连接。通常不需要此方法,Socket 应使用 net.createConnection() 创建和打开。仅在实现自定义 Socket 时使用此方法。

对于 TCP 连接,可用的 options 包括:

Attributes
autoSelectFamily:boolean
:如果设置为 true ,则启用一个族自动检测算法,该算法大致实现了 RFC 8305 的第 5 节。传递给查找的 all 选项设置为 true ,Socket 尝试按顺序连接所有获取的 IPv6 和 IPv4 地址,直到建立连接。首先尝试返回的第一个 AAAA 地址,然后返回的第一个 A 地址,然后返回的第二个 AAAA 地址,依此类推。每个连接尝试(最后一个除外)在超时并尝试下一个地址之前,将获得 autoSelectFamilyAttemptTimeout 选项指定的时间量。如果 family 选项不是 0 或设置了 localAddress ,则忽略。如果至少有一个连接成功,则不会发出连接错误。如果所有连接尝试都失败,则发出一个包含所有失败尝试的单个 AggregateError默认值: net.getDefaultAutoSelectFamily()
autoSelectFamilyAttemptTimeout:number
:在使用 autoSelectFamily 选项时,在尝试下一个地址之前等待连接尝试完成的毫秒数。如果设置为小于 10 的正整数,则将使用值 10默认值: net.getDefaultAutoSelectFamilyAttemptTimeout()
family:number
:IP 栈版本。必须是 460 。值 0 表示允许 IPv4 和 IPv6 地址。 默认值: 0
hints:number
可选的 [ dns.lookup() 提示][]。
host:string
Socket 应连接的主机。 默认值: 'localhost'
localAddress:string
Socket 应连接的本地地址。
localPort:number
Socket 应连接的本地端口。
lookup:Function
自定义查找函数。 默认值: dns.lookup()
port:number
必需。Socket 应连接的端口。

对于 IPC 连接,可用的 options 包括:

Attributes
path:string
必需。客户端应连接的路径。 详见 识别 IPC 连接的路径 。如果提供,则忽略上述 TCP 特定选项。
socket.connect(path, connectListener?): void
Attributes
path:string
客户端应连接的路径。详见 识别 IPC 连接的路径
connectListener:Function
socket.connect() 方法的通用参数。将作为 'connect' 事件的监听器添加一次。

在给定的 Socket 上发起 IPC 连接。

别名于 socket.connect(options[, connectListener]) 调用时 { path: path } 作为 options

M

socket.connect

History
socket.connect(port, host?, connectListener?): void
Attributes
port:number
客户端应连接的端口。
host:string
客户端应连接的主机。
connectListener:Function
socket.connect() 方法的通用参数。将作为 'connect' 事件的监听器添加一次。

在给定的 Socket 上发起 TCP 连接。

别名于 socket.connect(options[, connectListener]) 调用时 {port: port, host: host} 作为 options

P

socket.connecting

History

如果为 truesocket.connect(options[, connectListener]) 已 调用但尚未完成。它将保持 true 直到 Socket 连接,然后设置为 false 并发出 'connect' 事件。注意 socket.connect(options[, connectListener]) 回调是 'connect' 事件的监听器。

M

socket.destroy

History
socket.destroy(error?): void
Attributes
error:Object

确保此 Socket 上不再发生 I/O 活动。
销毁流并关闭连接。

详见 writable.destroy() 以获取更多详情。

  • 类型:boolean 指示连接是否已销毁。一旦连接被销毁,不能再使用它传输任何数据。

详见 writable.destroyed 以获取更多详情。

M

socket.destroySoon

History
socket.destroySoon(): void

在所有数据写入后销毁 Socket。如果 'finish' 事件已经发出,则立即销毁 Socket。如果 Socket 仍可写,则隐式调用 socket.end()

M

socket.end

History
socket.end(data?, encoding?, callback?): void
Attributes
data:string | Buffer | Uint8Array
encoding:string
仅当数据为 string 时使用。 默认值: 'utf8'
callback:Function
Socket 完成时的可选回调。

半关闭 Socket。即,它发送一个 FIN 包。服务器可能仍会发送一些数据。

详见 writable.end() 以获取更多详情。

P

socket.localAddress

History

远程客户端连接的本地 IP 地址的字符串表示。例如,在监听 '0.0.0.0' 的服务器中,如果客户端在 '192.168.1.1' 上连接,则 socket.localAddress 的值将是 '192.168.1.1'

P

socket.localPort

History

本地端口的数字表示。例如,8021

P

socket.localFamily

History

本地 IP 族的字符串表示。'IPv4''IPv6'

socket.pause(): void
  • 返回:net.Socket Socket 本身。

暂停数据读取。即,'data' 事件将不会发出。
可用于限制上传。

P

socket.pending

History

如果 Socket 尚未连接,则为 true,要么是因为 .connect() 尚未调用,要么是因为它仍在连接过程中(详见 socket.connecting)。

M

socket.ref

History
socket.ref(): void
  • 返回:net.Socket Socket 本身。

unref() 的反义词,在先前调用过 unref 的 Socket 上调用 ref() 允许程序退出,如果它是唯一剩下的 Socket(默认行为)。如果 Socket 已调用 ref,再次调用 ref 将无效。

P

socket.remoteAddress

History

远程 IP 地址的字符串表示。例如, '74.125.127.100''2001:4860:a005::68'。如果 Socket 已销毁(例如,如果客户端断开连接),值可能为 undefined

P

socket.remoteFamily

History

远程 IP 家族的字符串表示。'IPv4''IPv6'。如果 Socket 已销毁(例如,如果客户端断开连接),值可能为 undefined

P

socket.remotePort

History

远程端口的数字表示。例如,8021。如果 Socket 已销毁(例如,如果客户端断开连接),值可能为 undefined

P

socket.server

History
  • 类型:net.Server | null

接受该套接字的服务器的引用。对于未由服务器接受的套接字,此值为 null

M

socket.resetAndDestroy

History
socket.resetAndDestroy(): void
  • 返回:net.Socket

通过发送 RST 包关闭 TCP 连接并销毁流。
如果此 TCP Socket 处于连接状态,它将在连接后发送 RST 包并销毁此 TCP Socket。
否则,它将使用 ERR_SOCKET_CLOSED 错误调用 socket.destroy
如果这不是 TCP Socket(例如,管道),调用此方法将立即抛出 ERR_INVALID_HANDLE_TYPE 错误。

socket.resume(): void
  • 返回:net.Socket Socket 本身。

在调用 socket.pause() 后恢复读取。

M

socket.setEncoding

History
socket.setEncoding(encoding?): void
Attributes
encoding:string

将 Socket 的编码设置为 可读流。详见 readable.setEncoding() 以获取更多信息。

socket.setKeepAlive(): void

启用/禁用 keep-alive 功能,并可选择配置 keepalive 探测时序。返回该 socket 本身。

可能的签名:

启用 keep-alive 会设置在空闲 socket 上发送第一条 keepalive 探测之前的初始延迟。

设置 initialDelay(以毫秒为单位)可设置最后一个接收到的数据包与第一条 keepalive 探测之间的延迟。为 0 设置 initialDelay 将保持该值不变,仍使用默认值(或之前的)设置。

设置 interval(以毫秒为单位)可设置 keepalive 探测开始后连续探测之间的延迟(TCP_KEEPINTVL)。将 count 设置为在连接被断开前发送但未得到确认的探测次数(TCP_KEEPCNT)。这两个参数仅在启用 keep-alive 时生效。省略 intervalcount 时,分别使用 1000 毫秒和 10 的默认值。与 initialDelay 一样,非正的 intervalcount 会使相应的系统默认值保持不变。

initialDelayinterval 以毫秒为单位指定,但底层 socket 选项会按整秒配置;在应用之前,这些值会除以 1000 并向下取整。

启用 keep-alive 功能将设置以下 socket 选项:

  • SO_KEEPALIVE=1
  • TCP_KEEPIDLE=initialDelay / 1000
  • TCP_KEEPCNT=count
  • TCP_KEEPINTVL=interval / 1000

在早于 build 1709 的 Windows 版本上,keep-alive 通过 SIO_KEEPALIVE_VALS 配置,它没有探测计数字段,因此在这些平台上会忽略 count

M

socket.setKeepAlive

History
socket.setKeepAlive(options?): void
Attributes
options:Object
enable:boolean
默认值: false
initialDelay:number
默认值: 0
interval:number
默认值: 1000
count:number
默认值: 10

使用选项对象配置 keep-alive。有关每个属性的说明,请参见 socket.setKeepAlive()

socket.setKeepAlive(enable?, initialDelay?, interval?, count?): void
Attributes
enable:boolean
默认值: false
initialDelay:number
默认值: 0
interval:number
默认值: 1000
count:number
默认值: 10

使用位置参数配置保持活动。有关每个参数的说明,请参见 socket.setKeepAlive().

M

socket.setNoDelay

History
socket.setNoDelay(noDelay?): void
Attributes
noDelay:boolean
默认值: true

启用/禁用 Nagle 算法。

创建 TCP 连接时,将启用 Nagle 算法。

Nagle 算法会在通过网络发送数据之前延迟数据。它试图以增加延迟为代价优化吞吐量。

noDelay 传递 true 或不传递参数将禁用 Socket 的 Nagle 算法。为 noDelay 传递 false 将启用 Nagle 算法。

socket.setTimeout(timeout, callback?): void
Attributes
timeout:number
callback:Function

设置 Socket 在 Socket 上不活动 timeout 毫秒后超时。默认情况下,net.Socket 没有超时。

当触发空闲超时时,Socket 将收到 'timeout' 事件,但连接不会被切断。用户必须手动调用 socket.end()socket.destroy() 来结束连接。

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

如果 timeout 为 0,则禁用现有的空闲超时。

可选的 callback 参数将作为 'timeout' 事件的一次性监听器添加。

M

socket.getTypeOfService

History
socket.getTypeOfService(): void
  • 返回:integer 当前的 TOS 值。

返回此 Socket 的 IPv4 数据包的当前服务类型 (TOS) 字段或 IPv6 数据包的流量类别。

setTypeOfService() 可以在 Socket 连接之前调用;值将被缓存并在 Socket 建立连接时应用。 getTypeOfService() 甚至在连接之前也会返回当前设置的值。

在某些平台(例如,Linux)上,某些 TOS/ECN 位可能被屏蔽或忽略,并且行为在 IPv4 和 IPv6 或双栈 Socket 之间可能不同。调用者应验证特定于平台的语义。

M

socket.setTypeOfService

History
socket.setTypeOfService(tos): void
Attributes
要设置的 TOS 值(0-255)。

为从此 Socket 发送的 IPv4 数据包设置服务类型(TOS)字段,或为 IPv6 数据包设置流量类别。此功能可用于设置网络流量的优先级。

setTypeOfService() 可以在 Socket 连接之前调用;该值会被缓存,并在 Socket 建立连接时应用。 即使在连接之前,getTypeOfService() 也会返回当前设置。

在某些平台(例如 Linux)上,某些 TOS/ECN 位可能会被屏蔽或忽略,并且 IPv4 和 IPv6 或双栈 Socket 之间的行为可能有所不同。调用方应确认特定平台上的语义。

P

socket.timeout

History
  • 类型:number | undefined

socket.setTimeout() 设置的 Socket 超时(毫秒)。
如果未设置超时,则为 undefined

M

socket.unref

History
socket.unref(): void
  • 返回:net.Socket Socket 本身。

在 Socket 上调用 unref() 将允许程序退出,如果这是事件系统中唯一活动的 Socket。如果 Socket 已经 unref,再次调用 unref() 将无效。

M

socket.write

History
socket.write(data, encoding?, callback?): void
Attributes
data:string | Buffer | Uint8Array
encoding:string
仅当数据为 string 时使用。 默认值: utf8
callback:Function

在 Socket 上发送数据。第二个参数指定字符串情况下的编码。默认为 UTF8 编码。

如果整个数据成功刷新到内核缓冲区,则返回 true。如果全部或部分数据排队在用户内存中,则返回 false。当缓冲区再次空闲时,将发出 'drain'

可选的 callback 参数将在数据最终写出时执行,这可能不是立即的。

详见 Writablewrite() 方法以获取更多信息。

P

socket.readyState

History

此属性表示连接的状态(字符串)。

  • 如果套接字正在连接,则 socket.readyStateopening
  • 如果套接字可读且可写,则为 open
  • 如果套接字可读但不可写,则为 readOnly
  • 如果套接字不可读但可写,则为 writeOnly
  • 否则为 closed

类:net.BoundSocket

History

允许同步创建一个预绑定的套接字,之后可以将其传递给 listen()new net.Socket()。对于 listen(),这可实现同步端口预留;而对于 new net.Socket(),它允许通过 bind(2) 语义来控制本地出站端口/IP。

BoundSocket 可以绑定 TCP 端点(hostport),也可以绑定 Unix 域/命名管道端点(path);两者互斥。对于 path,文件系统条目会在构造函数中预留,因此诸如 EADDRINUSE 之类的冲突会像 TCP 绑定一样同步抛出。在 Linux 上,path 开头的 '\0' 会选择抽象命名空间(不创建文件系统条目);在其他平台上使用抽象路径会抛出 ERR_INVALID_ARG_VALUE

接管会转移套接字的所有权;此后调用 address()close() 会抛出 ERR_SOCKET_HANDLE_ADOPTED。从未被接管的句柄必须关闭,以避免套接字泄漏。关闭管道 BoundSocket 会移除其文件系统条目;抽象绑定和 TCP 绑定没有需要移除的条目。

当绑定到源 path 的管道 BoundSocket 作为客户端被接管后,连接成功时,该路径会作为套接字的 localAddress 报告。

当被接管的 BoundSocket 连接到数字 IP 字面量时,会同步发出 connect(2),因此 socket.connect() 返回后即可解析 socket.localAddress。连接失败仍会通过延迟触发的 'error' 事件报告。

import net from 'node:net';

const bound = new net.BoundSocket();
const { port } = bound.address();
console.log(`为服务器预留端口 ${port}`);

const server = net.createServer();
server.listen(bound); // 作为服务器接管,或者改为传给 new net.Socket()。
C

net.BoundSocket Constructor

History
new net.BoundSocket(options?): void
Attributes
options:Object
host:string
要绑定的本地地址。必须是数字 IP 字面量;不会执行 DNS 解析。 默认值: '0.0.0.0' ,或者当 ipv6Onlytrue 时为 '::'
port:number
本地端口。 0 请求操作系统分配临时端口。 默认值: 0
ipv6Only:boolean
设置 IPV6_V6ONLY ,禁用双栈支持,使套接字仅绑定 IPv6。仅对 IPv6 绑定有意义。 默认值: false
reusePort:boolean
设置 SO_REUSEPORT ,允许多个套接字绑定相同的地址和端口,以实现内核级负载均衡。是否支持取决于平台。 默认值: false
path:string
在给定路径绑定 Unix 域套接字(或 Windows 命名管道),而不是 TCP 端点。开头为 '\0' 时选择 Linux 抽象命名空间。与 hostportipv6OnlyreusePort 互斥;将它们组合使用会抛出 ERR_INVALID_ARG_VALUE
M

boundSocket.address

History
boundSocket.address(): void
  • 返回值:Object | string 对于 TCP 绑定,返回一个包含 addressfamilyport 属性的对象,类似 server.address() 的返回值。对于管道绑定,返回已绑定的路径字符串,类似管道服务器中 server.address() 的返回值。

返回已绑定的本地地址。当使用 port: 0 绑定时,port 是操作系统分配的临时端口。

P

boundSocket.isPipe

History
Attributes

当套接字使用 path 绑定(Unix 域套接字或 Windows 命名管道)时为 true,TCP 绑定时为 falsenet.BoundSocket.prototype 上存在此 getter 也可用作探测是否支持 path 的能力检测。

M

boundSocket.fd

History
boundSocket.fd(): void
  • 返回:integer 底层操作系统文件描述符;在不向套接字暴露文件描述符的平台上(例如 Windows),则为 -1

返回已绑定套接字的文件描述符。其所有权仍归 BoundSocket 所有,因此调用方不得关闭该描述符。 该描述符仅在句柄被接管之前可用;之后它属于接管它的 net.Servernet.Socket,并且 fd() 会抛出 ERR_SOCKET_HANDLE_ADOPTED

M

boundSocket.close

History
boundSocket.close(): void

释放已绑定的套接字。仅在句柄从未被接管时需要。

`boundSocketSymbol.dispose``

History

如果句柄尚未被接管或关闭,则关闭它;否则不执行任何操作。

net.connect(): void

别名于 net.createConnection()

可能的签名:

M

net.connect

History
net.connect(options, connectListener?): void
Attributes
options:对象
connectListener:函数

别名于 net.createConnection(options[, connectListener])

M

net.connect

History
net.connect(path, connectListener?): void
Attributes
path:字符串
connectListener:函数

别名于 net.createConnection(path[, connectListener])

M

net.connect

History
net.connect(port, host?, connectListener?): void
Attributes
port:数字
host:字符串
connectListener:函数

别名于 net.createConnection(port[, host][, connectListener])

net.createConnection(): void

这是一个工厂函数,它创建一个新的 net.Socket, 立即使用 socket.connect() 发起连接, 然后返回启动连接的 net.Socket

当连接建立时,将在返回的套接字上发出 'connect' 事件。 最后一个参数 connectListener,如果提供,将作为 'connect' 事件的监听器被添加 一次

可能的签名:

net.connect() 函数是此函数的别名。

M

net.createConnection

History
net.createConnection(options, connectListener?): void
Attributes
options:Object
必需。将被传递给 new net.Socket([options]) 调用和 socket.connect(options[, connectListener]) 方法。
connectListener:Function
net.createConnection() 函数的通用参数。如果提供,将作为 返回的套接字上的 'connect' 事件的监听器被添加一次。

可用选项参见 new net.Socket([options])socket.connect(options[, connectListener])

其他选项:

Attributes
预绑定的 BoundSocket , 用作 连接的源绑定,并遵循其本地地址和端口。采用后会消耗该绑定套接字(参见 所有权转移 )。
timeout:number
如果设置,将用于在套接字创建后、 开始连接之前调用 socket.setTimeout(timeout)

以下是 net.createServer() 部分描述的回显服务器的客户端示例:

import net from 'node:net';
const client = net.createConnection({ port: 8124 }, () => {
  // `'connect'` 监听器。
  console.log('已连接到服务器!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('已与服务器断开连接');
});
const net = require('node:net');
const client = net.createConnection({ port: 8124 }, () => {
  // `'connect'` 监听器。
  console.log('已连接到服务器!');
  client.write('world!\r\n');
});
client.on('data', (data) => {
  console.log(data.toString());
  client.end();
});
client.on('end', () => {
  console.log('已与服务器断开连接');
});

要连接到套接字 /tmp/echo.sock

以下是使用 portonread 选项的客户端示例。 在这种情况下,onread 选项将仅用于调用 new net.Socket([options]),而 port 选项将用于 调用 socket.connect(options[, connectListener])

import net from 'node:net';
import { Buffer } from 'node:buffer';
net.createConnection({
  port: 8124,
  onread: {
    // 为每次从套接字读取重用 4KiB Buffer。
    buffer: Buffer.alloc(4 * 1024),
    callback: function(nread, buf) {
      // 接收到的数据在 `buf` 中从 0 到 `nread` 可用。
      console.log(buf.toString('utf8', 0, nread));
    },
  },
});
const net = require('node:net');
net.createConnection({
  port: 8124,
  onread: {
    // 为每次从套接字读取重用 4KiB Buffer。
    buffer: Buffer.alloc(4 * 1024),
    callback: function(nread, buf) {
      // 接收到的数据在 `buf` 中从 0 到 `nread` 可用。
      console.log(buf.toString('utf8', 0, nread));
    },
  },
});

发起 IPC 连接

History
Attributes
path:string
套接字应连接到的路径。将被传递给 socket.connect(path[, connectListener]) 。 参见 识别 IPC 连接的路径
connectListener:Function
net.createConnection() 函数的通用参数, 发起套接字上的 'connect' 事件的“一次性”监听器。将被传递给 socket.connect(path[, connectListener])

发起一个 IPC 连接。

此函数创建一个所有选项设置为默认值的新 net.Socket, 立即使用 socket.connect(path[, connectListener]) 发起连接, 然后返回启动连接的 net.Socket

发起 TCP 连接

History
Attributes
port:number
套接字应连接到的端口。将被传递给 socket.connect(port[, host][, connectListener])
host:string
套接字应连接到的主机。将被传递给 socket.connect(port[, host][, connectListener])默认值: 'localhost'
connectListener:Function
net.createConnection() 函数的通用参数, 发起套接字上的 'connect' 事件的“一次性”监听器。将被传递给 socket.connect(port[, host][, connectListener])

发起一个 TCP 连接。

此函数创建一个所有选项设置为默认值的新 net.Socket, 立即使用 socket.connect(port[, host][, connectListener]) 发起连接, 然后返回启动连接的 net.Socket

net.createServer(options?, connectionListener?): void
Attributes
options:Object
allowHalfOpen:boolean
如果设置为 false ,则当可读端结束时,套接字将 自动结束可写端。 默认值: false
highWaterMark:number
可选地覆盖所有 net.SocketreadableHighWaterMarkwritableHighWaterMark默认值: 参见 stream.getDefaultHighWaterMark()
keepAlive:boolean
如果设置为 true ,则在收到新的传入连接后立即 在套接字上启用保持活跃功能,类似于 socket.setKeepAlive() 中所做的。 默认值: false
keepAliveInitialDelay:number
如果设置为正数,则设置在空闲套接字上 发送第一个保持活跃探测之前的初始延迟。 默认值: 0
noDelay:boolean
如果设置为 true ,则在收到新的传入连接后立即 禁用 Nagle 算法的使用。 默认值: false
pauseOnConnect:boolean
指示是否应在传入连接上暂停套接字。 默认值: false
blockList:net.BlockList
blockList 可用于禁用对特定 IP 地址、IP 范围或 IP 子网的入站访问。 如果服务器位于反向代理、NAT 等后面,则此功能不起作用,因为针对阻止列表检查的地址是代理的地址, 或由 NAT 指定的地址。
connectionListener:Function
自动设置为 'connection' 事件的监听器。

创建一个新的 TCP 或 IPC 服务器。

如果将 allowHalfOpen 设置为 true,则当套接字的另一端发出传输结束信号时, 服务器只有在显式调用 socket.end() 时才会发送传输结束信号。例如,在 TCP 上下文中,当接收到 FIN 数据包时,只有在显式调用 socket.end() 时才会发回 FIN 数据包。在此之前,连接处于半关闭状态(不可读但仍可写)。有关更多信息,请参见 'end' 事件和 [RFC 1122][half-closed](第 4.2.2.13 节)。

如果 pauseOnConnect 设置为 true,则与每个传入连接关联的套接字将被暂停, 并且不会从其句柄读取数据。 这允许在进程之间传递连接,而原始进程不读取任何数据。 要开始从暂停的套接字读取数据,调用 socket.resume()

服务器可以是 TCP 服务器或 IPC 服务器,取决于它调用 listen() 时使用的方式。

这是一个监听端口 8124 连接的 TCP 回显服务器示例:

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');
});
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 测试:

要监听套接字 /tmp/echo.sock

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

使用 nc 连接到 Unix 域套接字服务器:

M

net.getDefaultAutoSelectFamily

History
net.getDefaultAutoSelectFamily(): void

获取 socket.connect(options)autoSelectFamily 选项的当前默认值。 初始默认值为 true,除非提供了命令行选项 --no-network-family-autoselection

  • 返回:boolean autoSelectFamily 选项的当前默认值。
M

net.setDefaultAutoSelectFamily

History
net.setDefaultAutoSelectFamily(value): void

设置 socket.connect(options)autoSelectFamily 选项的默认值。

Attributes
value:boolean
新的默认值。 初始默认值为 true ,除非提供了命令行选项 --no-network-family-autoselection
M

net.getDefaultAutoSelectFamilyAttemptTimeout

History
net.getDefaultAutoSelectFamilyAttemptTimeout(): void

获取 socket.connect(options)autoSelectFamilyAttemptTimeout 选项的当前默认值。
初始默认值为 500,或通过命令行选项 --network-family-autoselection-attempt-timeout 指定的值。

  • 返回:number autoSelectFamilyAttemptTimeout 选项的当前默认值。
M

net.setDefaultAutoSelectFamilyAttemptTimeout

History
net.setDefaultAutoSelectFamilyAttemptTimeout(value): void

设置 socket.connect(options)autoSelectFamilyAttemptTimeout 选项的默认值。

Attributes
value:number
新的默认值,必须是正数。如果数字小于 10 ,则使用值 10 代替。初始默认值为 250 或通过命令行选项 --network-family-autoselection-attempt-timeout 指定的值。
M

net.isIP

History
net.isIP(input): void
Attributes
input:string

如果 input 是 IPv6 地址,则返回 6。如果 input点分十进制表示法 且没有前导零的 IPv4 地址,则返回 4。否则,返回 0

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
M

net.isIPv4

History
net.isIPv4(input): void
Attributes
input:string

如果 input点分十进制表示法 且没有前导零的 IPv4 地址,则返回 true。否则,返回 false

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
M

net.isIPv6

History
net.isIPv6(input): void
Attributes
input:string

如果 input 是 IPv6 地址,则返回 true。否则,返回 false

net.isIPv6('::1'); // 返回 true
net.isIPv6('fhqwhgads'); // 返回 false

net/promises API

History

稳定性:1 - 实验性

net/promises API 提供了一组返回 Promise 对象而不是依赖事件的 net 函数。该 API 可通过 require('node:net').promisesrequire('node:net/promises') 访问。

netPromises.connect(options): void
netPromises.connect(path): void
M

netPromises.connect

History
netPromises.connect(port, host?): void
Attributes
options:Object
接受与 net.connect() 相同的参数。可以包含一个 signal AbortSignal ,用于中止正在进行的连接尝试。

这是基于 Promise 的 net.connect() 替代方案。返回的 promise 会在其 'connect' 事件触发后使用该套接字履行;如果连接失败或 signal 被中止,则会被拒绝。当 promise 被拒绝时,底层套接字会被销毁。

该 API 根据其执行并等待的操作——连接——命名,以与 netPromises.listen() 平行。它没有命名为 createConnection(),因为该名称属于回调 API 的套接字工厂分类,而这里没有与之对应的 API。

import { connect } from 'node:net/promises';

const socket = await connect({ port: 8124 });
socket.write('hello world!');
socket.end();
M

netPromises.listen

History
netPromises.listen(options?): void
Attributes
options:Object
接受与 net.createServer()server.listen() 相同的选项,此外还包括:
connectionListener:Function
自动设置为 'connection' 事件的监听器。
可用于中止服务器的 AbortSignal 。如果在服务器开始监听前中止,则返回的 promise 会被拒绝,并显示 AbortError ;如果在之后的任何时间点中止,则会关闭服务器,这与 server.listen()signal 选项一致。

创建一个 net.Server 并开始监听。返回的 promise 会在服务器的 'listening' 事件触发后使用该服务器履行;如果服务器绑定失败,或在开始监听前 signal 被中止,则会被拒绝。当 promise 被拒绝时,服务器会被关闭。

解析后的服务器是异步可迭代对象,因此可以使用 for await...of 消费传入的连接(参见 server[Symbol.asyncIterator]())。

import { listen } from 'node:net/promises';

const server = await listen({ port: 8124 });
console.log('listening on', server.address().port);