首页 > 编程语言 > Node.js API详解之 net模块实例分析
2020
09-29

Node.js API详解之 net模块实例分析

本文实例讲述了Node.js API详解之 net模块。分享给大家供大家参考,具体如下:

Node.js API详解之 net

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

通过以下方式引入:

const net = require('net');

net.isIP(input)

说明:

测试 input 是否是 IP 地址。无效的字符串则返回 0,IPv4 地址则返回 4,IPv6的地址则返回 6。

demo:

const net = require('net');
console.log( net.isIP('127.0.0.1') );
// 4

net.isIPv4(input)

说明:

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

demo:

const net = require('net');
console.log( net.isIPv4('127.0.0.1') );
// true

net.isIPv6(input)

说明:

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

demo:

const net = require('net');
console.log( net.isIPv6('127.0.0.1') );
// false

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

说明:

创建一个新的TCP或IPC服务。
options:
allowHalfOpen: 表示是否允许一个半开的TCP连接。 默认值: false
pauseOnConnect:一旦来了连接,是否暂停套接字。 默认值: false
connectionListener:事件自动设置一个监听器。
如果 allowHalfOpen 被设置为true, 那么当socket.end() 被显式调用时,
如果对边套接字发送了一个FIN包,服务只会返回一个FIN数据包, 这会持续到后来连接处在半闭状态 (不可读但是可写)。
如果 pauseOnConnect 被设置为 true, 那么与连接相关的套接字都会暂停,也不会从套接字句柄读取数据。
这样就允许连接在进程之间传递,避免数据被最初的进程读取。 如果想从一个暂停的套接字开始读数据,请调用socket.resume()
服务可以是一个TCP服务或者一个 IPC 服务, 这取决于listen() 监听什么

demo:

const net = require('net');
const server = net.createServer((c) => {
 c.write('hello\r\n');
 c.pipe(c);
});
server.listen(8124, () => {
 console.log('server bound');
});

net.createConnection()

说明:

一个用于创建 net.Socket 的工厂函数,立即使用 socket.connect() 初始化链接,然后返回启动连接的 net.Socket。
当连接建立之后,在返回的 socket 上将触发一个 ‘connect' 事件。
若制定了最后一个参数 connectListener,则它将会被添加到 ‘connect' 事件作为一个监听器。
注意: net.connect() 函数也是该函数的别名。

net.createConnection(options[, connectListener])

说明:

与net.createConnection()功能一致。
connectListener:如果传递该参数,将被添加为返回 socket 上的 ‘connect' 事件上的监听器。
注意: net.connect(options[, connectListener]) 函数也是该函数的别名。

demo:

const net = require('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,第二行只需要改为:
const client = net.createConnection({ path: '/tmp/echo.sock' });

net.createConnection(path[, connectListener])

说明:

初始化一个 IPC 连接。
该方法使用所有默认选项创建一个新的 net.Socket,
使用 socket.connect(path[, connectListener]) 立即初始化连接,然后返回初始化连接的 net.Socket。
path: Socket 应该被连接到的路径。
注意: net.connect(path[, connectListener]) 函数也是该函数的别名。

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

说明:

初始化一个TCP连接
这个函数用默认配置创建一个新的net.Socket,
然后socket.connect(port[, host][, connectListener])初始化一个连接,并返回开启连接的那个 net.Socket。
注意: net.connect(port[, host][, connectListener]) 函数也是该函数的别名。

net.Server 类

说明:

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

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

说明:

创建一个net.Server实例。
与net.createServer([options][, connectionListener])功能一致

demo:

const net = require('net');
const server = new net.Server((c) => {
 // 'connection' listener
 c.write('hello');
});
server.on('error', (err) => {
 throw err;
});
server.listen(8124, () => {
 console.log('server bound');
});

server.listen()

说明:

为 connections 启动一个 server 监听.
一个 net.Server 可以是一个 TCP 或者 一个 IPC server,这取决于它监听什么。
可能的参数:
server.listen(handle[, backlog][, callback])
server.listen(options[, callback])
server.listen(path[, backlog][, callback]) for IPC servers
server.listen([port][, host][, backlog][, callback]) for TCP servers
这个函数是异步的。当 server 开始监听,'listening' 事件会触发。
最后一个参数 callback 将会被添加为'listening' 事件的监听器。
监听时,其中一个最常见的错误是 EADDRINUSE。这是因为另一个 server 已经监听了该请求中的 port / path / handle。

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

说明:

启动一个服务器,监听已经绑定到端口、UNIX 域套接字或 Windows 命名管道的给定句柄上的连接。
句柄对象可以是服务器、套接字(任何具有底层 _handle 成员的东西),
也可以是具有 fd 成员的对象,该成员是一个有效的文件描述符。
注意:在Windows上不支持在文件描述符上进行监听。

server.listen(options[, callback])

说明:

启动一个TCP服务监听输入的port和host。
options:必须。支持以下参数属性:
port:端口
host:主机
path:如果指定了 port 参数则会被忽略。
如果指定了 port 参数,该方法的行为跟 server.listen([port][, hostname][, backlog][, callback]) 一样。
否则,如果指定了 path 参数,该方法的行为与 server.listen(path[, backlog][, callback]) 一致。
如果没有 port 或者 path 参数,则会抛出一个错误。

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

说明:

启动一个 IPC 服务器监听给定 path 的连接。
path:服务器需要监听的路径

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

说明:

启动一个TCP服务监听输入的port和host。
如果port省略或是0,系统会随意分配一个在'listening'事件触发后能被server.address().port检索的无用端口。

server.listening

说明:

一个布尔值, 表明 server 是否正在监听连接

demo:

const net = require('net');
const server = new net.Server((c) => {
 // 'connection' listener
 c.write('hello');
});
server.on('error', (err) => {
 throw err;
});
server.listen(8124, () => {
 console.log(server.listening);
});
// true

listening 事件

说明:

当服务被绑定后调用

demo:

const net = require('net');
const server = new net.Server((c) => {
 // 'connection' listener
 c.write('hello');
});
server.on('listening', () => {
 console.log('开始监听');
});
server.listen(8124, () => {
 console.log(server.listening);
});
// 开始监听

server.address()

说明:

如果在IP socket上监听,则返回绑定的ip地址, 地址族和操作系统报告的服务端口
在找到操作系统分配的地址时,找到指定的端口是有用的.
返回一个有 port, family, 和 address 属性: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }的对象
对于在管道或UNIX域套接字上侦听的server,该名称将返回为字符串
只有到了 ‘listening' 事件被触发时候.才可以调用 server.address()

demo:

const net = require('net');
const server = new net.Server((c) => {
 // 'connection' listener
 c.write('hello');
});
server.on('error', (err) => {
 throw err;
});
server.listen(8124, () => {
 console.log('opened server on', server.address());
});
// opened server on { address: '::', family: 'IPv6', port: 8124 }

server.maxConnections

说明:

设置该属性使得当 server 连接数过多时拒绝连接。
一旦将一个 socket 发送给 child_process.fork() 生成的子进程,就不推荐使用该选项。

demo:

const net = require('net');
const server = new net.Server((c) => {
 // 'connection' listener
 c.write('hello');
});
server.maxConnections = 10;
server.listen(8124, () => {
 console.log(server.listening);
});

server.getConnections(callback)

说明:

异步获取服务器的当前并发连接数。当 socket 被传递给子进程时工作。
回调函数的两个参数是 err 和 count。

demo:

const net = require('net');
const server = new net.Server((c) => {
 // 'connection' listener
 c.write('hello');
});
server.getConnections((err, count) => {
 console.log(count);
});
server.listen(8124, () => {
 console.log(server.listening);
});
// 0

server.connections (已废弃)

说明:

获取服务器的当前并发连接数。

connection 事件

说明:

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

demo:

const net = require('net');
const server = new net.Server((c) => {
  // 'connection' listener
  c.write('hello');
});
server.on('connection', (socket) => {
 console.log(socket);
});
server.listen(8124, () => {
  console.log(server.listening);
});

server.unref()

说明:

如果这个server在事件系统中是唯一有效的,那么对server调用unref将允许程序退出。
如果这个server已经调用过unref那么再次调用将不会再有效果。

server.ref()

说明:

在一个已经调用 unref 的 server 中调用 ref,如果 server 是仅存的 server,则程序不会退出(默认)。
对一个已经调用 ref 的 server 再次调用 ref 将不会再有效果。

server.close([callback])

说明:

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

demo:

const net = require('net');
const server = new net.Server((c) => {
  // 'connection' listener
  c.write('hello');
});
server.listen(8124, () => {
  console.log(server.listening);
});
server.close();

close 事件

说明:

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

demo:

const net = require('net');
const server = new net.Server((c) => {
  // 'connection' listener
  c.write('hello');
});
server.on('close', () => {
 console.log('server 已关闭')
})
server.listen(8124, () => {
  console.log(server.listening);
});
server.close();
// server 已关闭

error 事件

说明:

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

demo:

const net = require('net');
const server = new net.Server((c) => {
  // 'connection' listener
  c.write('hello');
});
server.on('error', (err) => {
 console.log('发生异常', err);
})
server.listen(8124, () => {
  console.log(server.listening);
});

net.Socket 类

说明:

这个类是 TCP 或 UNIX Socket 的抽象(在Windows上使用命名管道,而UNIX使用域套接字)。
一个net.Socket也是一个duplex stream,所以它能被读或写,并且它也是一个EventEmitter。
net.Socket可以被用户创建并直接与server通信。
举个例子,它是通过net.createConnection()返回的,所以用户可以使用它来与server通信。
当一个连接被接收时,它也能被Node.js创建并传递给用户。
比如,它是通过监听在一个net.Server上的'connection'事件触发而获得的,那么用户可以使用它来与客户端通信。

new net.Socket([options])

说明:

创建一个 socket 对象。
options:
fd:如果指定了该参数,则使用一个给定的文件描述符包装一个已存在的 socket,否则将创建一个新的 socket。
allowHalfOpen:指示是否允许半打开的 TCP 连接。默认是 false。
readable:当传递了 fd 时允许读取 socket,否则忽略。默认 false。
writable:当传递了 fd 时允许写入 socket,否则忽略。默认 false。
新创建的 socket 可以是 TCP socket 也可以是 IPC 端点流,取决于它连接 connect() 到什么。

socket.connect()

说明:

在给定的套接字上启动一个连接。
该方法是异步的。当连接建立了的时候,'connect' 事件将会被触发。
如果连接过程中有问题,'error' 事件将会代替 ‘connect' 事件被触发,并将错误信息传递给 ‘error' 监听器。
最后一个参数 connectListener,如果指定了,将会被添加为 ‘connect' 事件的。
可能的用法:
socket.connect(options[, connectListener])
socket.connect(path[, connectListener]) 用于 IPC 连接。
socket.connect(port[, host][, connectListener]) 用于 TCP 。

socket.connect(options[, connectListener])

说明:

在给定的 socket 上初始化一个连接。
通常该方法是不需要的,应该使用 net.createConnection() 来创建和打开 socket。
一般只在实现一个自定义的 Socket 的时候使用该方法。
对于 TCP 连接可能的 options 有:
port 必须。Socket 连接的端口。
host Socket 连接的主机。默认是 ‘localhost'.
localAddress Socket 连接的本地地址。
localPort Socket 连接的本地端口。
family IP栈的版本,可以是4或6。默认值为4。
hints 可选的dns.lookup() hints.
lookup 自定义的 lookup 方法。默认是 dns.lookup().
对于 IPC 连接可能的 options 有:
path 必须。客户端连接的路径。

socket.connect(path[, connectListener])

说明:

在给定的 socket 上初始化 IPC 。
相当使用 { path: path } 作为 options 调用 socket.connect(options[, connectListener]) 方法。

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

说明:

在给定的 socket 上初始化一个 TCP 连接。
相当于使用 {port: port, host: host} 作为 options 调用 socket.connect(options[, connectListener]) 方法。

connect 事件

说明:

当一个 socket 连接成功建立的时候触发该事件。

socket.connecting

说明:

该属性如果为 true 则socket.connect(options[, connectListener]) 被调用但还未结束。
当发送 connect 事件或调用 socket.connect(options[, connectListener]) 的回调函数的时候会被设置为 false。

close 事件

说明:

一旦 socket 完全关闭就发出该事件。
参数 had_error 是 boolean 类型,表明 socket 被关闭是否取决于传输错误。

data 事件

说明:

当接收到数据的时触发该事件。data 参数是一个 Buffer 或 String。
数据编码由 socket.setEncoding() 设置。
注意:当 Socket 发送 data 事件的时候,如果没有监听者数据将会丢失。

drain 事件

说明:

当写入缓冲区变为空时触发。可以用来做上传节流。

error 事件

说明:

当错误发生时触发。'close' 事件也会紧接着该事件被触发。

lookup 事件

说明:

在找到主机之后创建连接之前触发。不可用于 UNIX socket。
参数:
err:错误对象。
address:IP地址
family:地址类型。
host:主机

timeout 事件

说明:

当 socket 超时的时候触发。该事件只是用来通知 socket 已经闲置。用户必须手动关闭。

socket.address()

说明:

返回操作系统报告的 socket 的地址、地址族和端口。
返回的对象有三个属性,例如: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }

socket.bufferSize

说明:

net.Socket 具有该属性,socket.write() 工作时需要。它可以帮助用户快速启动和运行。
计算机(处理速度)不能总是跟上 socket 的写入速度 ? 网络连接可能太慢了。
Node.js 内部将维护一个写入 socket 的数据队列,并在可能的时候将数据发送出去。
(内部实现是对 socket 的文件描述符进行轮训其是否是可写状态。)
使用内部缓冲的结果是可能造成内存的增长。此属性显示当前即将被写入的缓冲的字符数。
(字符串的数目大致等于即将被写入的字节,但缓冲可能包含字符串,而字符串是惰性编码的,所以实际的字节数是不知道的。)
对处理大量或持续增长的 bufferSize 有经验的用户应该注意使用 socket.pause() and socket.resume() 对他们程序中的数据流进行节流。

socket.bytesRead

说明:

接收的字节数量。

socket.bytesWritten

说明:

发送的字节数量。

socket.destroy([exception])

说明:

确保在该 socket 上不再有 I/O 活动。仅在出现错误的时候才需要(如解析错误等)。
如果制定了 exception,则将会触发一个 ‘error' 事件,任何监听器都将接收到 exception 作为一个参数。

socket.destroyed

说明:

一个布尔值,用来指示连接是否已经被销毁。一旦连接被销毁就不能再使用它传输任何数据。

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

说明:

半关闭 socket。例如发送一个 FIN 包。服务端仍可以发送数据。
如果指定了 data,则相当于调用 socket.write(data, encoding) 之后再调用 socket.end()。

end 事件

说明:

当 socket 的另一端发送一个 FIN 包的时候触发,从而结束 socket 的可读端。
默认情况下(allowHalfOpen为false),socket 将发送一个 FIN 数据包,
并且一旦写出它的等待写入队列就销毁它的文件描述符。
当然,如果 allowHalfOpen 为 true,socket 就不会自动结束 end() 它的写入端,允许用户写入任意数量的数据。
用户必须调用 end() 显示地结束这个连接(例如发送一个 FIN 数据包。)

socket.localAddress

说明:

远程客户端连接的本地 IP 地址字符串。
例如,一个服务端正在连接到 ‘0.0.0.0',客户端连接到的是 ‘192.168.1.1',则 socket.localAddress 的值是 ‘192.168.1.1'。

socket.localPort

说明:

用数字表示的本地端口。例如 80 或 21。

socket.pause()

说明:

暂停读写数据。也就是说,'data' 将不会再被触发。可以用于上传节流

socket.resume()

说明:

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

socket.unref()

说明:

如果活跃的 socket 是事件系统中仅存的 socket,则调用 unref 将会允许程序退出。
对一个已经调用了 unref 的 socket 再调用 unref 无效。

socket.ref()

说明:

与 unref 相反,在一个已经调用 unref 的 socket 中调用 ref,
如果 socket 是仅存的 socket,则程序不会退出(默认)。对一个已经调用 ref 的 socket 再次调用 ref 将不会再有效果。

socket.remoteAddress

说明:

用字符串表示的远程 IP 地址。例如 ‘74.125.127.100' 或 ‘2001:4860:a005::68'。
如果 socket 被销毁了(如客户端已经失去连接)则其值为 undefined。

socket.remoteFamily

说明:

用字符串表示的远程 IP 协议族。'IPv4′ 或 ‘IPv6'。

socket.remotePort

说明:

用数字表示的远程端口。例如 80 或 21。

socket.setEncoding([encoding])

说明:

设置作为可读流(Readable Stream)的编码。

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

说明:

启用/禁用长连接功能, 并且在第一个长连接探针被发送到一个空闲的 socket 之前可选则配置初始延迟。enable 默认为 false。
initialDelay(毫秒)用来设置接收到最后一个数据包和发送第一个长连接探针之间的延迟。
将 initialDelay 设置为 0,则会保持默认值(或之前设置的值)不变。默认是 0。

socket.setNoDelay([noDelay])

说明:

禁止 Nagle 。默认情况下 TCP 连接使用 Nagle 算法,在发送之前缓冲数据。
将 noDelay 设置为 true 将会在每次 socket.write() 被调用的时候立即发送数据。noDelay默认是 true。

socket.setTimeout(timeout[, callback])

说明:

当 socket 在 timeout 毫秒不活动之后将其设置为超时状态。默认 net.Socket 没有超时。
当一个闲置的超时被触发,socket 将会收到一个 ‘timeout' 事件,但连接不会被断开。
用户必须手动调用 socket.end() 或 socket.destroy() 来断开连接。
如果 timeout 是 0,则存在的闲置超时将会被禁止。
可选的 callback 参数将会被当作一个时间监听器被添加到 ‘timeout' 事件。

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

说明:

在 socket 上发送数据。第二个参数制定了字符串的编码 ? 默认是 UTF8 编码。
如果全部数据都成功刷新到内核的缓冲则返回 true。
如果全部或部分数据在用户内中排队,则返回 false。当缓冲再次空闲的时候将触发 ‘drain' 事件。
当数据最终都被写出之后,可选的 callback 参数将会被执行 ? 可能不会立即执行。

希望本文所述对大家node.js程序设计有所帮助。

编程技巧