开发手册 欢迎您!
软件开发者资料库

网络(Net) | Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

Node.js v8.x 中文文档


目录

net (网络)#

稳定性: 2 - 稳定

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

通过以下方式引入:

const net = require('net');

IPC Support#

net 模块在 Windows 上支持命名管道 IPC,在其他操作系统上支持 UNIX 域套接字。

Identifying paths for IPC connections#

[net.connect()][], [net.createConnection()][], [server.listen()][] 和[socket.connect()][] 使用一个 path 参数来识别 IPC 端点。

在 UNIX 上,本地域也称为 UNIX 域。参数 path 是文件系统路径名。它被从 sizeof(sockaddr_un.sun_path) - 1 处被截断,其长度因操作系统不同而在 91 至 107 字节之间变化。典型值在 Linux 上为 107,在 macOS 上为 103。该路径受到与创建文件相同的命名约定和权限检查。它将在文件系统中可见,并且将持续到取消链接的时候。

在 Windows 上,本地域通过命名管道实现。路径必须是以 \\?\pipe\\\.\pipe\ 为入口。路径允许任何字符,但后面的字符可能会对管道名称进行一些处理,例如解析 .. 序列。尽管如此,管道空间是平面的。管道不会持续,当最后一次引用关闭时,管道就会被删除。不要忘了 JavaScript 字符串转义需要使用双反斜杠指定路径,例如:

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

net.Server 类#

这个类用于创建 TCP 或 [IPC][] server。

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

  • 返回:

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

net.Server is an [EventEmitter][]实现了以下事件:

'close' 事件#

当server关闭的时候触发. 注意,如果有连接存在, 直到所有的连接结束才会触发这个事件

'connection' 事件#

  • connection 对象

当一个新的connection建立的时候触发. socket 是一个net.Socket的实例对象.

'error' 事件#

当错误出现的时候触发. 不同与 [net.Socket][], ['close'][]事件不会在这个事件触发后继续触发 除非[server.close()][] 是手动调用. 在[server.listen()][]中的例子.

'listening' 事件#

当服务被绑定后调用 [server.listen()][].

server.address()#

如果在IP socket上监听,则返回绑定的ip地址, 地址族和操作系统报告的服务端口在找到操作系统分配的地址时,找到指定的端口是有用的.返回一个有 port, family, 和 address 属性:{ port: 12346, family: 'IPv4', address: '127.0.0.1' }的对象

对于在管道或UNIX域套接字上侦听的server,该名称将返回为字符串

例子:

const server = net.createServer((socket) => {  socket.end('goodbye\n');}).on('error', (err) => {  // handle errors here  throw err;});// grab an arbitrary unused port.server.listen(() => {  console.log('opened server on', server.address());});

只有到了 'listening' 事件被触发时候.才可以调用 server.address()

server.close([callback])#

  • 返回:

停止 server接受建立新的connections并保持已经存在的connections.此功能是异步的,当所有的connections关闭同时server响应 ['close'][]事件的时候,server将会最终关闭.一旦'close'发生将会调用可选的回调函数. 与该事件不同, 如果服务器在关闭时未打开,则将使用错误作为唯一参数。

返回 server

server.connections#

稳定性: 0 - 废弃的: 使用 [server.getConnections()][] 来替代。

服务器上并发的连接数。

当发送一个 socket 给用child_process.fork() 创建的子进程时,这会返回 null 。要轮询分叉(forks)获得活动连接数可以使用异步的server.getConnections()来替代。

server.getConnections(callback)#

  • Returns

异步获取服务器的当前并发连接数。当 socket 被传递给子进程时工作。

回调函数的两个参数是 err 和 count。

server.listen()#

为 connections 启动一个 server 监听. 一个 net.Server 可以是一个 TCP 或者 一个 [IPC][] server,这取决于它监听什么。

可能的参数:

  • [server.listen(handle[, backlog][, callback])][server.listen(handle)]
  • [server.listen(options[, callback])][server.listen(options)]
  • [server.listen(path[, backlog][, callback])][server.listen(path)]for [IPC][] servers
  • [server.listen([port][, host][, backlog][, callback])][server.listen(port, host)]for TCP servers

这个函数是异步的。当 server 开始监听,['listening'][] 事件会触发。最后一个参数callback 将会被添加为['listening'][] 事件的监听器。

所有的 listen() 方法可以传入一个 backlog 参数来指定待连接队列的最大长度。实际长度将通过 OS 的 sysctl 设置, 例如 linux 里的 tcp_max_syn_backlogsomaxconn。这个参数的默认值是511 (不是512)

说明

  • 所有的 [net.Socket][] 都被设置为 SO_REUSEADDR (详见 [socket(7)][])

  • server.listen() 方法可能会被调用多次。每个后续的调用都将使用其提供的选项重新打开服务器。

监听时,其中一个最常见的错误是 EADDRINUSE。这是因为另一个 server 已经监听了该请求中的 port / path / handle。处理这种情况的一种方法是在一定时间后重试:

server.on('error', (e) => {  if (e.code === 'EADDRINUSE') {    console.log('Address in use, retrying...');    setTimeout(() => {      server.close();      server.listen(PORT, HOST);    }, 1000);  }});

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