Skip to content

网络

[稳定版: 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。对于 Node.js < v20.4.0,我们可以绑定 \0

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

识别 IPC 连接的路径

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 字符串转义需要使用额外的反斜杠转义来指定路径,例如:

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

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

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

新增于: v15.0.0, v14.18.0

  • net <string> | <net.SocketAddress> 网络 IPv4 或 IPv6 地址。
  • prefix <number> CIDR 前缀位数。对于 IPv4,此值必须介于 032 之间。对于 IPv6,此值必须介于 0128 之间。
  • type <string> 'ipv4''ipv6'默认值: 'ipv4'

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

blockList.check(address[, type])

新增于: v15.0.0, v14.18.0

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

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 值
  • 如果 valuenet.BlockList,则返回 true

类: net.SocketAddress

新增于: v15.14.0, v14.18.0

new net.SocketAddress([options])

新增于: v15.14.0, v14.18.0

  • options <Object>
    • address <string> 网络地址,可以是 IPv4 或 IPv6 字符串。默认: 如果 family'ipv4',则为 '127.0.0.1';如果 family'ipv6',则为 '::'
    • family <string> 'ipv4''ipv6' 之一。默认: 'ipv4'
    • flowlabel <number> 仅当 family'ipv6' 时使用的 IPv6 流标签。
    • port <number> IP 端口。

socketaddress.address

新增于: v15.14.0, v14.18.0

socketaddress.family

新增于: v15.14.0, v14.18.0

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

当建立新连接时发出。socketnet.Socket 的实例。

事件: 'error'

新增于: v0.1.90

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

事件: 'listening'

新增于: v0.1.90

在调用 server.listen() 后绑定服务器时发出。

事件: 'drop'

新增于: v18.6.0, v16.17.0

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

  • data <Object> 传递给事件监听器的参数。

server.address()

[历史]

版本变更
v18.4.0family 属性现在返回字符串而不是数字。
v18.0.0family 属性现在返回数字而不是字符串。
v0.1.90v0.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())
})

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

server.close([callback])

新增于: v0.1.90

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

server[Symbol.asyncDispose]()

新增于: v20.5.0, v18.18.0

[稳定性: 1 - 实验性]

稳定性: 1 稳定性: 1 - 实验性

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

server.getConnections(callback)

新增于: v0.9.7

异步获取服务器上并发连接的数量。当套接字发送到子进程时有效。

回调函数应接受两个参数 errcount

server.listen()

启动服务器监听连接。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 上监听时,就会发生这种情况。处理此问题的一种方法是在一段时间后重试:

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

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

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]) 相同。如果两者都没有指定,则会抛出错误。

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

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

exclusivetrue 并且底层句柄共享时,多个工作进程可能会查询具有不同 backlog 的句柄。在这种情况下,将使用传递给主进程的第一个 backlog

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

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

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

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

Added in: v0.1.90

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

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

Added in: v0.1.90

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

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

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

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

server.listening

新增于: v5.7.0

server.maxConnections

[历史]

版本变更
v21.0.0maxConnections 设置为 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() 相反,如果之前调用过 unref(),则对服务器调用 ref()不会让程序在它是唯一剩余的服务器时退出(默认行为)。如果服务器已 ref,则再次调用 ref() 将不会有任何作用。

server.unref()

新增于: v0.9.1

对服务器调用 unref() 将允许程序在它是事件系统中唯一活动的服务器时退出。如果服务器已经 unref,则再次调用 unref() 将不会有任何作用。

类: net.Socket

新增于: v0.3.4

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

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

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

new net.Socket([options])

[历史]

版本变更
v15.14.0添加了 AbortSignal 支持。
v12.10.0添加了 onread 选项。
v0.3.4在 v0.3.4 版本中添加
  • options <对象> 可用的选项包括:

    • allowHalfOpen <布尔值> 如果设置为 false,则当可读端结束时,套接字将自动结束可写端。详情请参见 net.createServer()'end' 事件。默认值: false

    • fd <数字> 如果指定,则围绕具有给定文件描述符的现有套接字进行封装,否则将创建一个新的套接字。

    • onread <对象> 如果指定,则传入的数据将存储在一个单独的 buffer 中,并在套接字上收到数据时传递给提供的 callback。这将导致流功能不提供任何数据。套接字将像往常一样发出诸如 'error''end''close' 之类的事件。诸如 pause()resume() 之类的方法也将按预期运行。

    • buffer <Buffer> | <Uint8Array> | <函数> 用于存储传入数据的可重用内存块,或者返回此类内存块的函数。

    • callback <函数> 此函数针对每块传入数据调用。它有两个参数:写入 buffer 的字节数和对 buffer 的引用。从此函数返回 false 以隐式 pause() 套接字。此函数将在全局上下文中执行。

    • readable <布尔值> 传递 fd 时允许读取套接字,否则忽略。默认值: false

    • signal <AbortSignal> 可用于销毁套接字的中断信号。

    • writable <布尔值> 传递 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 的族。可以是 IPv6 的 6 或 IPv4 的 4

启动新的连接尝试时发出。如果在 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 将是 BufferString。数据的编码由 socket.setEncoding() 设置。

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

事件:'drain'

添加于:v0.1.90

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

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

事件:'end'

添加于:v0.1.90

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

默认情况下(allowHalfOpenfalse),套接字将发送传输结束数据包并在写入其挂起的写入队列后销毁其文件描述符。但是,如果将 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.0family 属性现在返回字符串而不是数字。
v18.0.0family 属性现在返回数字而不是字符串。
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.0autoSelectFamily 选项的默认值可以使用 setDefaultAutoSelectFamily 或命令行选项 --enable-network-family-autoselection 在运行时更改。
v20.0.0, v18.18.0autoSelectFamily 选项的默认值现在为 true--enable-network-family-autoselection CLI 标志已重命名为 --network-family-autoselection。旧名称现在是别名,但不建议使用。
v19.3.0, v18.13.0添加了 autoSelectFamily 选项。
v17.7.0, v16.15.0现在支持 noDelaykeepAlivekeepAliveInitialDelay 选项。
v6.0.0hints 选项现在在所有情况下都默认为 0。以前,在没有 family 选项的情况下,它默认为 `dns.ADDRCONFIG
v5.11.0现在支持 hints 选项。
v0.1.90v0.1.90 版本中添加

在一个给定的套接字上启动连接。通常不需要此方法,套接字应该使用 net.createConnection() 创建和打开。只有在实现自定义套接字时才使用此方法。

对于 TCP 连接,可用的 options 为:

  • autoSelectFamily <布尔值>: 如果设置为 true,则启用一种家族自动检测算法,该算法松散地实现了 RFC 8305 的第 5 节。传递给 lookup 的 all 选项设置为 true,并且套接字尝试依次连接到所有获得的 IPv6 和 IPv4 地址,直到建立连接。首先尝试返回的第一个 AAAA 地址,然后是第一个返回的 A 地址,然后是第二个返回的 AAAA 地址,依此类推。每个连接尝试(最后一个除外)都会获得由 autoSelectFamilyAttemptTimeout 选项指定的时间量,然后再超时并尝试下一个地址。如果 family 选项不是 0 或设置了 localAddress,则忽略此选项。如果至少一个连接成功,则不会发出连接错误。如果所有连接尝试都失败,则会发出包含所有失败尝试的单个 AggregateError默认值:net.getDefaultAutoSelectFamily()
  • autoSelectFamilyAttemptTimeout <数字>: 使用 autoSelectFamily 选项时,在尝试下一个地址之前等待连接尝试完成的时间量(以毫秒为单位)。如果设置为小于 10 的正整数,则将使用值 10默认值:net.getDefaultAutoSelectFamilyAttemptTimeout()
  • family <数字>: IP 堆栈的版本。必须是 460。值 0 表示允许 IPv4 和 IPv6 地址。默认值:0
  • hints <数字> 可选的 dns.lookup() 提示
  • host <字符串> 套接字应连接到的主机。默认值:'localhost'
  • keepAlive <布尔值> 如果设置为 true,则在连接建立后立即在套接字上启用保持活动功能,类似于 socket.setKeepAlive() 中的操作。默认值:false
  • keepAliveInitialDelay <数字> 如果设置为正数,则设置在空闲套接字上发送第一个 keepalive 探测之前的初始延迟。默认值:0
  • localAddress <字符串> 套接字应从中连接的本地地址。
  • localPort <数字> 套接字应从中连接的本地端口。
  • lookup <函数> 自定义查找函数。默认值:dns.lookup()
  • noDelay <布尔值> 如果设置为 true,则在套接字建立后立即禁用 Nagle 算法的使用。默认值:false
  • port <数字> 必需。套接字应连接到的端口。
  • blockList <net.BlockList> blockList 可用于禁用对特定 IP 地址、IP 范围或 IP 子网的出站访问。

对于 IPC 连接,可用的 options 为:

socket.connect(path[, connectListener])

在给定的套接字上启动 进程间通信 连接。

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

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

新增于: v0.1.90

在给定的套接字上启动 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

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

更多详情请参见 writable.destroy()

socket.destroyed

  • <布尔值> 指示连接是否已销毁。一旦连接被销毁,就无法再使用它传输数据。

更多详情请参见 writable.destroyed

socket.destroySoon()

新增于:v0.3.4

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

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

新增于:v0.1.90

半关闭套接字。即,它发送一个 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

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

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() 的反向操作,对先前已调用 unref 的套接字调用 ref()不会 允许程序在它是唯一剩余套接字时退出(默认行为)。如果套接字已 ref,则再次调用 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

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

socket.resetAndDestroy()

新增于:v18.3.0, v16.17.0

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

socket.resume()

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

socket.setEncoding([encoding])

新增于: v0.1.90

将套接字的编码设置为 可读流。更多信息请参见 readable.setEncoding()

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

[历史]

版本变更
v13.12.0, v12.17.0添加了 TCP_KEEPCNTTCP_KEEPINTVL 套接字选项的新默认值。
v0.1.92新增于: v0.1.92

启用/禁用 keep-alive 功能,并可选地设置在空闲套接字上发送第一个 keepalive 探测之前的初始延迟。

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

启用 keep-alive 功能将设置以下套接字选项:

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

socket.setNoDelay([noDelay])

新增于: v0.1.90

启用/禁用 Nagle 算法。

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

Nagle 算法会延迟数据发送到网络。它试图以牺牲延迟为代价来优化吞吐量。

noDelay 设置为 true 或不传递参数将为套接字禁用 Nagle 算法。将 noDelay 设置为 false 将启用 Nagle 算法。

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参数将在数据最终写入时执行,这可能并非立即执行。

有关更多信息,请参见 Writablewrite() 方法。

socket.readyState

新增于:v0.5.0

此属性以字符串形式表示连接的状态。

  • 如果流正在连接,socket.readyStateopening
  • 如果流可读可写,则为 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])

附加选项:

以下是 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' })

以下是使用 portonread 选项的客户端示例。在这种情况下,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: {
    // 为套接字的每次读取重用一个 4KiB 的 Buffer。
    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: {
    // 为套接字的每次读取重用一个 4KiB 的 Buffer。
    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现在支持 noDelaykeepAlivekeepAliveInitialDelay 选项。
v0.5.0v0.5.0 版本中添加
  • options <对象>

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

  • 返回值: <net.Server>

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

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

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

服务器可以是 TCP 服务器或 IPC 服务器,具体取决于它 listen() 的对象。

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

js
import net from 'node:net'
const server = net.createServer(c => {
  // 'connection' 监听器。
  console.log('客户端已连接')
  c.on('end', () => {
    console.log('客户端已断开连接')
  })
  c.write('hello\r\n')
  c.pipe(c)
})
server.on('error', err => {
  throw err
})
server.listen(8124, () => {
  console.log('服务器已绑定')
})
js
const net = require('node:net')
const server = net.createServer(c => {
  // 'connection' 监听器。
  console.log('客户端已连接')
  c.on('end', () => {
    console.log('客户端已断开连接')
  })
  c.write('hello\r\n')
  c.pipe(c)
})
server.on('error', err => {
  throw err
})
server.listen(8124, () => {
  console.log('服务器已绑定')
})

使用 telnet 测试:

bash
telnet localhost 8124

要在 /tmp/echo.sock 套接字上监听:

js
server.listen('/tmp/echo.sock', () => {
  console.log('服务器已绑定')
})

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

bash
nc -U /tmp/echo.sock

net.getDefaultAutoSelectFamily()

新增于:v19.4.0

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

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

net.setDefaultAutoSelectFamily(value)

新增于:v19.4.0

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

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

net.getDefaultAutoSelectFamilyAttemptTimeout()

新增于:v19.8.0, v18.18.0

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

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

net.setDefaultAutoSelectFamilyAttemptTimeout(value)

新增于: v19.8.0, v18.18.0

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

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

net.isIP(input)

新增于: v0.3.0

如果 input 是 IPv6 地址,则返回 6。如果 input 是没有前导零的 点分十进制表示法 的 IPv4 地址,则返回 4。否则,返回 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

如果 input 是一个没有前导零的点分十进制表示法的 IPv4 地址,则返回 true。否则,返回 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

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

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