Net
History
稳定性:2 - 稳定
node:net 模块提供了一个异步网络 API,用于创建基于流的
TCP 或 IPC 服务器(net.createServer())和客户端
(net.createConnection())。
可以使用以下方式访问它:
import net from 'node:net';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'));BlockList 对象可与某些网络 API 一起使用,以指定规则
禁用对特定 IP 地址、IP 范围或
IP 子网的入站或出站访问。
blockList.addAddress(address, type?): void<string>
|
<net.SocketAddress><string>'ipv4'
或
'ipv6'
。
默认:
'ipv4'
。添加一条规则以阻止给定的 IP 地址。
blockList.addRange(start, end, type?): void<string>
|
<net.SocketAddress><string>
|
<net.SocketAddress><string>'ipv4'
或
'ipv6'
。
默认:
'ipv4'
。添加一条规则以阻止从 start(包含)到
end(包含)的 IP 地址范围。
blockList.addSubnet(net, prefix, type?): void<string>
|
<net.SocketAddress><number>0
和
32
之间。对于 IPv6,此值必须在
0
和
128
之间。<string>'ipv4'
或
'ipv6'
。
默认:
'ipv4'
。添加一条规则以阻止指定为子网掩码的 IP 地址范围。
blockList.check(address, type?): void<string>
|
<net.SocketAddress><string>'ipv4'
或
'ipv6'
。
默认:
'ipv4'
。<boolean>如果给定的 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- 类型:
<string[]>
添加到阻止列表的规则列表。
BlockList.isBlockList(value): void<any>value
是
net.BlockList
,则返回
true
。blockList.fromJSON(value): void稳定性:1 - 实验性
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));valueBlocklist.rules
blockList.toJSON(): void稳定性:1 - 实验性
- 返回 Blocklist.rules
new net.SocketAddress(options?): void- 类型:
<string>
- 类型:
<string>'ipv4'或'ipv6'。
- 类型:
<number>
- 类型:
<number>
SocketAddress.parse(input): void<string>123.1.2.3:1234
或
[1::1]:1234
。- 继承自:{EventEmitter}
此类用于创建 TCP 或 IPC 服务器。
new net.Server(options?, connectionListener?): void<Function>'connection'
事件的监听器。<net.Server>net.Server 是一个 EventEmitter,具有以下事件:
当服务器关闭时发出。如果存在连接,则此 事件直到所有连接结束后才会发出。
- 类型:
<net.Socket>连接对象
当建立新连接时发出。socket 是
net.Socket 的实例。
- 类型:
<Error>
当发生错误时发出。与 net.Socket 不同,'close'
事件不会在此事件之后直接发出,除非
手动调用 server.close()。参见 server.listen() 讨论中的示例。
当调用 server.listen() 后服务器已绑定时发出。
当连接数达到 server.maxConnections 的阈值时,
服务器将丢弃新连接并发出 'drop' 事件。如果是
TCP 服务器,则参数如下,否则参数为 undefined。
server.address(): void如果在监听 IP 套接字,则返回操作系统报告的服务器绑定的 address、地址 family 名称和 port
(当获取操作系统分配的地址时,用于查找分配了哪个端口很有用):
{ 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。
server.close(callback?): void<Function><net.Server>停止服务器接受新连接并保持现有
连接。此函数是异步的,当所有连接结束且服务器发出 'close' 事件时,服务器最终关闭。
可选的 callback 将在 'close' 事件发生时调用一次。与该事件不同,如果服务器
在关闭时未开启,它将仅带有一个 Error 作为其参数被调用。
server[Symbol.asyncDispose](): void调用 server.close() 并返回一个 promise,当服务器
关闭时该 promise 会被兑现。
server.getConnections(callback): void<Function><net.Server>异步获取服务器上的并发连接数。当套接字被发送到 叉进程时有效。
回调应接受两个参数 err 和 count。
server.listen(): void启动服务器监听连接。net.Server 可以是 TCP 或
IPC 服务器,具体取决于它监听的内容。
可能的签名:
server.listen(handle[, backlog][, callback])server.listen(options[, callback])server.listen(path[, backlog][, callback])用于 IPC 服务器server.listen([port[, host[, backlog]]][, callback])用于 TCP 服务器
此函数是异步的。当服务器开始监听时,
'listening' 事件将被发出。最后一个参数 callback
将作为 'listening' 事件的监听器添加。
所有 listen() 方法都可以接受一个 backlog 参数来指定待处理连接队列的最大
长度。实际长度将由操作系统通过 sysctl 设置确定,例如
Linux 上的 tcp_max_syn_backlog 和 somaxconn。此参数的默认值为 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('Address in use, retrying...');
setTimeout(() => {
server.close();
server.listen(PORT, HOST);
}, 1000);
}
});server.listen(handle, backlog?, callback?): void在已经绑定到端口、Unix 域套接字或 Windows 命名管道的给定 handle 上
启动服务器监听连接。
handle 对象可以是服务器、套接字(任何具有底层 _handle 成员的对象),或具有
有效文件描述符的 fd 成员的对象。
Windows 上不支持监听文件描述符。
server.listen
History
支持 reusePort 选项。
添加了 AbortSignal 支持。
支持 ipv6Only 选项。
server.listen(options, callback?): void<Object><number>server.listen()
函数的通用参数。<boolean>false<string><boolean>ipv6Only
设置为
true
将
禁用双栈支持,即,绑定到主机
::
不会使
0.0.0.0
被绑定。
默认:
false
。<boolean>reusePort
设置为
true
允许
同一主机上的多个套接字绑定到同一端口。传入连接
由操作系统分发到监听套接字。此选项
仅在某些平台上可用,例如 Linux 3.9+、DragonFlyBSD 3.6+、FreeBSD 12.0+、
Solaris 11.4 和 AIX 7.2.5+。在不支持的平台上,此选项会抛出
错误。
默认:
false
。<string>port
将被忽略。参见
识别 IPC 连接的路径
。<number><boolean>false
。<AbortSignal><boolean>false
。<Function><net.Server>如果指定了 port,其行为与
server.listen([port[, host[, backlog]]][, callback]) 相同。
否则,如果指定了 path,其行为与
server.listen(path[, backlog][, callback]) 相同。
如果未指定任何一项,将抛出错误。
如果 exclusive 为 false(默认),则集群工作进程将使用相同的
底层句柄,允许共享连接处理职责。当
exclusive 为 true 时,句柄不共享,尝试共享端口
会导致错误。下面展示了一个监听独占端口的示例。
server.listen({
host: 'localhost',
port: 80,
exclusive: true,
});当 exclusive 为 true 且底层句柄被共享时,
几个工作进程可能会使用不同的 backlog 查询句柄。
在这种情况下,将使用传递给主进程的第一个 backlog。
以 root 身份启动 IPC 服务器可能会导致服务器路径对
非特权用户不可访问。使用 readableAll 和 writableAll 将使服务器
对所有用户可访问。
如果启用了 signal 选项,在相应的
AbortController 上调用 .abort() 类似于在服务器上调用 .close():
const controller = new AbortController();
server.listen({
host: 'localhost',
port: 80,
signal: controller.signal,
});
// 稍后,当你想要关闭服务器时。
controller.abort();server.listen(path, backlog?, callback?): void<string><number>server.listen()
函数的通用参数。<Function><net.Server>启动 IPC 服务器监听给定 path 上的连接。
server.listen(port?, host?, backlog?, callback?): void<number><string><number>server.listen()
函数的通用参数。<Function><net.Server>启动 TCP 服务器监听给定 port 和 host 上的连接。
如果省略 port 或为 0,操作系统将分配一个任意
未使用的端口,可以在 'listening' 事件发出后
通过使用 server.address().port 检索该端口。
如果省略 host,当 IPv6 可用时,服务器将接受
未指定的 IPv6 地址 (::) 上的连接,否则接受
未指定的 IPv4 地址 (0.0.0.0) 上的连接。
在大多数操作系统中,监听 未指定的 IPv6 地址 (::)
可能会导致 net.Server 也监听 未指定的 IPv4 地址
(0.0.0.0)。
- 类型:
<boolean>指示服务器是否正在监听连接。
server.maxConnections
History
将 maxConnections 设置为 0 会丢弃所有传入连接。此前,它被解释为 Infinity。
- 类型:
<integer>
当连接数达到 server.maxConnections 阈值时:
-
如果进程未在集群模式下运行,Node.js 将关闭连接。
-
如果进程在集群模式下运行,默认情况下,Node.js 会将连接路由到另一个工作进程。要改为关闭连接,请将
server.dropMaxConnection设置为true。
一旦套接字已通过 child_process.fork() 发送到子进程,
不建议使用此选项。
- 类型:
<boolean>
将此属性设置为 true 以在连接数达到 server.maxConnections 阈值时开始关闭连接。此设置仅在集群模式下有效。
server.ref(): void- 返回:
<net.Server>
unref() 的反操作,对之前 unref 的服务器调用 ref() 将
不会 让程序退出,如果它是唯一剩下的服务器(默认行为)。
如果服务器已 ref,再次调用 ref() 将无效。
server.unref(): void- 返回:
<net.Server>
在服务器上调用 unref() 将允许程序退出,如果这是
事件系统中唯一的活跃服务器。如果服务器已经 unref,再次调用
unref() 将无效。
类:net.Socket
History
- 继承自:
<stream.Duplex>
此类是 TCP Socket 或流式 IPC 端点(在 Windows 上使用命名管道,在其他系统上使用 Unix 域套接字)的抽象。它也是一个 EventEmitter。
net.Socket 可以由用户创建并直接用于与服务器交互。例如,它由 net.createConnection() 返回,因此用户可以使用它与服务器通信。
它也可以由 Node.js 创建并在收到连接时传递给用户。例如,它被传递给 net.Server 上发出的 'connection' 事件的监听器,因此用户可以使用它与客户端交互。
new net.Socket(options?): void<Object><boolean><net.BlockList>blockList
可用于禁用对特定 IP 地址、IP 范围或 IP 子网的出站访问。<number><boolean><number>0
。<boolean>true
,则在 Socket 建立后立即禁用 Nagle 算法的使用。
默认值:
false
。<Object>buffer
中,并在数据到达 Socket 时传递给提供的
callback
。
这将导致流功能不提供任何数据。
Socket 将照常发出
'error'
、
'end'
和
'close'
等事件。
pause()
和
resume()
等方法也将按
预期行为。<Uint8Array>
|
<Function><Function>buffer
的字节数和对
buffer
的引用。从此函数返回
false
以隐式
pause()
Socket。此函数将在全局上下文中执行。<boolean>fd
时允许在 Socket 上读取,否则忽略。
默认值:
false
。<AbortSignal><number><boolean>fd
时允许在 Socket 上写入,否则忽略。
默认值:
false
。<net.Socket>创建一个新的 Socket 对象。
新创建的 Socket 可以是 TCP Socket 或流式 IPC 端点,具体取决于它 connect() 到什么。
事件:'close'
History
<boolean>true
。在 Socket 完全关闭后发出。参数 hadError 是一个布尔值,表示 Socket 是否因传输错误而关闭。
事件:'connect'
History
在 Socket 连接成功建立时发出。
详见 net.createConnection()。
事件:'connectionAttempt'
History
在新的连接尝试启动时发出。如果在 socket.connect(options) 中启用了族自动选择算法,则可能会多次发出此事件。
事件:'connectionAttemptFailed'
History
在连接尝试失败时发出。如果在 socket.connect(options) 中启用了族自动选择算法,则可能会多次发出此事件。
事件:'connectionAttemptTimeout'
History
在连接尝试超时时发出。仅当在 socket.connect(options) 中启用了族自动选择算法时才会发出此事件(并且可能会多次发出)。
事件:'data'
History
- 类型:
<string>
在收到数据时发出。参数 data 将是 Buffer 或
String。数据的编码由 socket.setEncoding() 设置。
如果 Socket 发出 'data' 事件时没有监听器,数据将会丢失。
事件:'drain'
History
在写入缓冲区变为空时发出。可用于限制上传。
另见:socket.write() 的返回值。
事件:'end'
History
当 Socket 的另一端信号传输结束时发出,从而结束 Socket 的可读端。
默认情况下(allowHalfOpen 为 false),Socket 将发送一个传输结束包,并在写出其待处理的写入队列后销毁其文件描述符。但是,如果 allowHalfOpen 设置为 true,则 Socket 不会自动 end() 其可写端,允许用户写入任意数量的数据。用户必须显式调用 end() 来关闭连接(即发送一个 FIN 包回来)。
事件:'error'
History
- 类型:
<Error>
在发生错误时发出。'close' 事件将在此事件之后直接调用。
事件:'lookup'
History
现在支持 host 参数。
在解析主机名之后但在连接之前发出。 不适用于 Unix 套接字。
事件:'ready'
History
在 Socket 准备好使用时发出。
在 'connect' 之后立即触发。
事件:'timeout'
History
如果 Socket 因不活动而超时时发出。这仅用于通知 Socket 处于空闲状态。用户必须手动关闭连接。
socket.address(): void- 返回:
<Object>
返回操作系统报告的 Socket 绑定的 address、地址 family 名称和 port:
{ port: 12346, family: 'IPv4', address: '127.0.0.1' }
- 类型:
<string[]>
仅当在 socket.connect(options) 中启用了族自动选择算法时,此属性才存在,它是已尝试地址的数组。
每个地址都是 $IP:$PORT 形式的字符串。如果连接成功,则最后一个地址是 Socket 当前连接的地址。
稳定性:0 - 已废弃:改用
writable.writableLength。
- 类型:
<integer>
此属性显示缓冲用于写入的字符数。缓冲区可能包含编码后长度未知的字符串。因此这个数字只是缓冲区中字节数的近似值。
net.Socket 具有 socket.write() 始终有效的属性。这是为了帮助用户快速上手。计算机无法总是跟上写入 Socket 的数据量。网络连接可能 просто 太慢。Node.js 将在内部队列化写入 Socket 的数据,并在可能时通过线路发送出去。
此内部缓冲的后果是内存可能会增长。遇到大型或不断增长的 bufferSize 的用户应尝试使用 socket.pause() 和 socket.resume() 在其程序中“限制”数据流。
- 类型:
<integer>
接收的字节数。
- 类型:
<integer>
发送的字节数。
socket.connect(): void在给定的 Socket 上发起连接。
可能的签名:
socket.connect(options[, connectListener])socket.connect(path[, connectListener])用于 IPC 连接。socket.connect(port[, host][, connectListener])用于 TCP 连接。- 返回:
<net.Socket>Socket 本身。
此函数是异步的。当连接建立时,将发出 'connect' 事件。如果连接有问题,将发出 'error' 事件而不是 'connect' 事件,错误将传递给 'error' 监听器。
最后一个参数 connectListener,如果提供,将作为 'connect' 事件的监听器添加一次。
此函数仅应用于在发出 'close' 后重新连接 Socket,否则可能导致未定义的行为。
socket.connect
History
autoSelectFamily 选项的默认值现在为 true。--enable-network-family-autoselection CLI 标志已重命名为--network-family-autoselection。旧名称现在是别名,但不推荐使用。
autoSelectFamily 选项的默认值可以在运行时使用 setDefaultAutoSelectFamily 更改或通过命令行选项 --enable-network-family-autoselection 更改。
添加了 autoSelectFamily 选项。
现在支持 noDelay、keepAlive 和 keepAliveInitialDelay选项。
现在所有情况下 hints 选项的默认值均为 0。以前,在没有 family 选项的情况下,它默认为 dns.ADDRCONFIG | dns.V4MAPPED。
现在支持 hints 选项。
socket.connect(options, connectListener?): void<Object><Function>socket.connect()
方法的通用参数。将作为
'connect'
事件的监听器添加一次。<net.Socket>
Socket 本身。在给定的 Socket 上发起连接。通常不需要此方法,Socket 应使用 net.createConnection() 创建和打开。仅在实现自定义 Socket 时使用此方法。
对于 TCP 连接,可用的 options 包括:
<boolean>true
,则启用一个族自动检测算法,该算法大致实现了
RFC 8305
的第 5 节。传递给查找的
all
选项设置为
true
,Socket 尝试按顺序连接所有获取的 IPv6 和 IPv4 地址,直到建立连接。首先尝试返回的第一个 AAAA 地址,然后返回的第一个 A 地址,然后返回的第二个 AAAA 地址,依此类推。每个连接尝试(最后一个除外)在超时并尝试下一个地址之前,将获得
autoSelectFamilyAttemptTimeout
选项指定的时间量。如果
family
选项不是
0
或设置了
localAddress
,则忽略。如果至少有一个连接成功,则不会发出连接错误。如果所有连接尝试都失败,则发出一个包含所有失败尝试的单个
AggregateError
。
默认值:
net.getDefaultAutoSelectFamily()
。<number>autoSelectFamily
选项时,在尝试下一个地址之前等待连接尝试完成的毫秒数。如果设置为小于
10
的正整数,则将使用值
10
。
默认值:
net.getDefaultAutoSelectFamilyAttemptTimeout()
。<number>4
、
6
或
0
。值
0
表示允许 IPv4 和 IPv6 地址。
默认值:
0
。<number>dns.lookup()
提示][]。<string>'localhost'
。<string><number><Function>dns.lookup()
。<number>对于 IPC 连接,可用的 options 包括:
<string>socket.connect(path, connectListener?): void<string><Function>socket.connect()
方法的通用参数。将作为
'connect'
事件的监听器添加一次。<net.Socket>
Socket 本身。在给定的 Socket 上发起 IPC 连接。
别名于
socket.connect(options[, connectListener])
调用时 { path: path } 作为 options。
socket.connect(port, host?, connectListener?): void<number><string><Function>socket.connect()
方法的通用参数。将作为
'connect'
事件的监听器添加一次。<net.Socket>
Socket 本身。在给定的 Socket 上发起 TCP 连接。
别名于
socket.connect(options[, connectListener])
调用时 {port: port, host: host} 作为 options。
- 类型:
<boolean>
如果为 true,
socket.connect(options[, connectListener]) 已
调用但尚未完成。它将保持 true 直到 Socket 连接,然后设置为 false 并发出 'connect' 事件。注意
socket.connect(options[, connectListener])
回调是 'connect' 事件的监听器。
socket.destroy(error?): void<Object><net.Socket>确保此 Socket 上不再发生 I/O 活动。 销毁流并关闭连接。
详见 writable.destroy() 以获取更多详情。
- 类型:
<boolean>指示连接是否已销毁。一旦连接被销毁,不能再使用它传输任何数据。
详见 writable.destroyed 以获取更多详情。
socket.destroySoon(): void在所有数据写入后销毁 Socket。如果 'finish' 事件已经发出,则立即销毁 Socket。如果 Socket 仍可写,则隐式调用 socket.end()。
socket.end(data?, encoding?, callback?): void<string>
|
<Uint8Array><string>string
时使用。
默认值:
'utf8'
。<Function><net.Socket>
Socket 本身。半关闭 Socket。即,它发送一个 FIN 包。服务器可能仍会发送一些数据。
详见 writable.end() 以获取更多详情。
- 类型:
<string>
远程客户端连接的本地 IP 地址的字符串表示。例如,在监听 '0.0.0.0' 的服务器中,如果客户端在 '192.168.1.1' 上连接,则 socket.localAddress 的值将是 '192.168.1.1'。
- 类型:
<integer>
本地端口的数字表示。例如,80 或 21。
- 类型:
<string>
本地 IP 族的字符串表示。'IPv4' 或 'IPv6'。
socket.pause(): void- 返回:
<net.Socket>Socket 本身。
暂停数据读取。即,'data' 事件将不会发出。
可用于限制上传。
- 类型:
<boolean>
如果 Socket 尚未连接,则为 true,要么是因为 .connect() 尚未调用,要么是因为它仍在连接过程中(详见 socket.connecting)。
socket.ref(): void- 返回:
<net.Socket>Socket 本身。
unref() 的反义词,在先前 unref 的 Socket 上调用 ref() 将 不 允许程序退出,如果它是唯一剩下的 Socket(默认行为)。如果 Socket 已 ref,再次调用 ref 将无效。
- 类型:
<string>
远程 IP 地址的字符串表示。例如,
'74.125.127.100' 或 '2001:4860:a005::68'。如果 Socket 已销毁(例如,如果客户端断开连接),值可能为 undefined。
- 类型:
<string>
远程 IP 族的字符串表示。'IPv4' 或 'IPv6'。如果 Socket 已销毁(例如,如果客户端断开连接),值可能为 undefined。
- 类型:
<integer>
远程端口的数字表示。例如,80 或 21。如果 Socket 已销毁(例如,如果客户端断开连接),值可能为 undefined。
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() 后恢复读取。
socket.setEncoding(encoding?): void<string><net.Socket>
Socket 本身。将 Socket 的编码设置为 可读流。详见
readable.setEncoding() 以获取更多信息。
socket.setKeepAlive
History
添加了 TCP_KEEPCNT 和 TCP_KEEPINTVL Socket 选项的新默认值。
socket.setKeepAlive(enable?, initialDelay?): void启用/禁用保活功能,并可选设置在空闲 Socket 上发送第一个保活探测之前的初始延迟。
设置 initialDelay(以毫秒为单位)以设置最后一个数据包接收和第一个保活探测之间的延迟。将 0 设置为 initialDelay 将使值保持与默认值(或之前的设置)不变。
启用保活功能将设置以下 Socket 选项:
SO_KEEPALIVE=1TCP_KEEPIDLE=initialDelayTCP_KEEPCNT=10TCP_KEEPINTVL=1
socket.setNoDelay(noDelay?): void<boolean>true<net.Socket>
Socket 本身。启用/禁用 Nagle 算法的使用。
创建 TCP 连接时,将启用 Nagle 算法。
Nagle 算法在网络发送之前延迟数据。它试图以延迟为代价优化吞吐量。
为 noDelay 传递 true 或不传递参数将禁用 Socket 的 Nagle 算法。为 noDelay 传递 false 将启用 Nagle 算法。
socket.setTimeout
History
现在向 callback 参数传递无效的回调会抛出 ERR_INVALID_ARG_TYPE 而不是ERR_INVALID_CALLBACK。
socket.setTimeout(timeout, callback?): void设置 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' 事件的一次性监听器添加。
socket.getTypeOfService(): void- 返回:
<integer>当前的 TOS 值。
返回此 Socket 的 IPv4 数据包的当前服务类型 (TOS) 字段或 IPv6 数据包的流量类别。
setTypeOfService() 可以在 Socket 连接之前调用;值将被缓存并在 Socket 建立连接时应用。
getTypeOfService() 甚至在连接之前也会返回当前设置的值。
在某些平台(例如,Linux)上,某些 TOS/ECN 位可能被屏蔽或忽略,并且行为在 IPv4 和 IPv6 或双栈 Socket 之间可能不同。调用者应验证特定于平台的语义。
socket.setTypeOfService(tos): void<integer><net.Socket>
Socket 本身。设置从此 Socket 发送的 IPv4 数据包的服務類型 (TOS) 字段或 IPv6 数据包的流量类别。这可用于优先处理网络流量。
setTypeOfService() 可以在 Socket 连接之前调用;值将被缓存并在 Socket 建立连接时应用。
getTypeOfService() 甚至在连接之前也会返回当前设置的值。
在某些平台(例如,Linux)上,某些 TOS/ECN 位可能被屏蔽或忽略,并且行为在 IPv4 和 IPv6 或双栈 Socket 之间可能不同。调用者应验证特定于平台的语义。
- 类型:
<number>|<undefined>
由 socket.setTimeout() 设置的 Socket 超时(毫秒)。
如果未设置超时,则为 undefined。
socket.unref(): void- 返回:
<net.Socket>Socket 本身。
在 Socket 上调用 unref() 将允许程序退出,如果这是事件系统中唯一活动的 Socket。如果 Socket 已经 unref,再次调用 unref() 将无效。
socket.write(data, encoding?, callback?): void<string>
|
<Uint8Array><string>string
时使用。
默认值:
utf8
。<Function><boolean>在 Socket 上发送数据。第二个参数指定字符串情况下的编码。默认为 UTF8 编码。
如果整个数据成功刷新到内核缓冲区,则返回 true。如果全部或部分数据排队在用户内存中,则返回 false。当缓冲区再次空闲时,将发出 'drain'。
可选的 callback 参数将在数据最终写出时执行,这可能不是立即的。
详见 Writable 流 write() 方法以获取更多信息。
- 类型:
<string>
此属性表示连接的状态(字符串)。
- 如果流正在连接,
socket.readyState为opening。 - 如果流可读且可写,则为
open。 - 如果流可读但不可写,则为
readOnly。 - 如果流不可读但可写,则为
writeOnly。
net.connect(): void可能的签名:
net.connect(options[, connectListener])net.connect(path[, connectListener])用于 IPC 连接。net.connect(port[, host][, connectListener])用于 TCP 连接。
net.connect(options, connectListener?): void别名于
net.createConnection(options[, connectListener])。
net.connect(path, connectListener?): void别名于
net.createConnection(path[, connectListener])。
net.connect(port, host?, connectListener?): void别名于
net.createConnection(port[, host][, connectListener])。
net.createConnection(): void一个工厂函数,它创建一个新的 net.Socket,
立即使用 socket.connect() 发起连接,
然后返回启动连接的 net.Socket。
当连接建立时,将在返回的套接字上发出 'connect' 事件。
最后一个参数 connectListener,如果提供,将作为 'connect' 事件的监听器被添加 一次。
可能的签名:
net.createConnection(options[, connectListener])net.createConnection(path[, connectListener])用于 IPC 连接。net.createConnection(port[, host][, connectListener])用于 TCP 连接。
net.connect() 函数是此函数的别名。
net.createConnection(options, connectListener?): void<Object>new net.Socket([options])
调用和
socket.connect(options[, connectListener])
方法。<Function>net.createConnection()
函数的通用参数。如果提供,将作为
返回的套接字上的
'connect'
事件的监听器被添加一次。<net.Socket>
用于启动连接的新创建的套接字。可用选项参见
new net.Socket([options])
和 socket.connect(options[, connectListener])。
其他选项:
<number>socket.setTimeout(timeout)
。以下是 net.createServer() 部分描述的回显服务器的客户端示例:
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');
});要连接到套接字 /tmp/echo.sock:
const client = net.createConnection({ path: '/tmp/echo.sock' });以下是使用 port 和 onread 选项的客户端示例。
在这种情况下,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));
},
},
});net.createConnection(path, connectListener?): void<string>socket.connect(path[, connectListener])
。
参见
识别 IPC 连接的路径
。<Function>net.createConnection()
函数的通用参数,
发起套接字上的
'connect'
事件的“一次性”监听器。将被传递给
socket.connect(path[, connectListener])
。<net.Socket>
用于启动连接的新创建的套接字。发起一个 IPC 连接。
此函数创建一个所有选项设置为默认值的新 net.Socket,
立即使用
socket.connect(path[, connectListener]) 发起连接,
然后返回启动连接的 net.Socket。
net.createConnection(port, host?, connectListener?): void<number>socket.connect(port[, host][, connectListener])
。<string>socket.connect(port[, host][, connectListener])
。
默认值:
'localhost'
。<Function>net.createConnection()
函数的通用参数,
发起套接字上的
'connect'
事件的“一次性”监听器。将被传递给
socket.connect(port[, host][, connectListener])
。<net.Socket>
用于启动连接的新创建的套接字。发起一个 TCP 连接。
此函数创建一个所有选项设置为默认值的新 net.Socket,
立即使用
socket.connect(port[, host][, connectListener]) 发起连接,
然后返回启动连接的 net.Socket。
net.createServer(options?, connectionListener?): void<Object><boolean>false
,则当可读端结束时,套接字将
自动结束可写端。
默认值:
false
。<number>net.Socket
的
readableHighWaterMark
和
writableHighWaterMark
。
默认值:
参见
stream.getDefaultHighWaterMark()
。<boolean><number>0
。<boolean>true
,则在收到新的传入连接后立即
禁用 Nagle 算法的使用。
默认值:
false
。<boolean>false
。<net.BlockList>blockList
可用于禁用对特定 IP 地址、IP 范围或 IP 子网的入站访问。
如果服务器位于反向代理、NAT 等后面,则此功能不起作用,因为针对阻止列表检查的地址是代理的地址,
或由 NAT 指定的地址。<Function>'connection'
事件的监听器。<net.Server>创建一个新的 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');
});使用 telnet 测试:
telnet localhost 8124要监听套接字 /tmp/echo.sock:
server.listen('/tmp/echo.sock', () => {
console.log('server bound');
});使用 nc 连接到 Unix 域套接字服务器:
nc -U /tmp/echo.socknet.getDefaultAutoSelectFamily(): void获取 socket.connect(options) 的 autoSelectFamily 选项的当前默认值。
初始默认值为 true,除非提供了命令行选项 --no-network-family-autoselection。
- 返回:
<boolean>autoSelectFamily选项的当前默认值。
net.setDefaultAutoSelectFamily(value): void设置 socket.connect(options) 的 autoSelectFamily 选项的默认值。
<boolean>true
,除非提供了命令行选项
--no-network-family-autoselection
。net.getDefaultAutoSelectFamilyAttemptTimeout(): void获取 socket.connect(options) 的 autoSelectFamilyAttemptTimeout 选项的当前默认值。
初始默认值为 500 或通过命令行选项 --network-family-autoselection-attempt-timeout 指定的值。
- 返回:
<number>autoSelectFamilyAttemptTimeout选项的当前默认值。
net.setDefaultAutoSelectFamilyAttemptTimeout(value): void设置 socket.connect(options) 的 autoSelectFamilyAttemptTimeout 选项的默认值。
<number>10
,则使用值
10
代替。初始默认值为
250
或通过命令行选项
--network-family-autoselection-attempt-timeout
指定的值。net.isIP(input): void如果 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'); // 返回 0net.isIPv4(input): void如果 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'); // 返回 falsenet.isIPv6(input): void如果 input 是 IPv6 地址,则返回 true。否则,返回 false。
net.isIPv6('::1'); // 返回 true
net.isIPv6('fhqwhgads'); // 返回 false