25. 网络模块

Node.js net模块用于创建服务器和客户端。

此模块提供异步网络包装器,可以使用以下语法导入它。var net = require("net")

25.1. 方法

  • net.createServer([options][, connectionListener]):创建一个新的TCP服务器。 connectionListener参数自动设置为“connection”事件的侦听器。
  • net.connect(options[, connectionListener]):一个工厂方法,它返回一个新的’net.Socket’并连接到提供的地址和端口。
  • net.createConnection(options[, connectionListener]):一个工厂方法,它返回一个新的’net.Socket’并连接到提供的地址和端口。
  • net.connect(port[, host][, connectListener]):创建到主机端口的TCP连接。 如果省略host,则假定为“localhost”。 connectListener参数将添加为“connect”事件的侦听器。 它是一个返回新的’net.Socket’的工厂方法。
  • net.createConnection(port[, host][, connectListener]):创建到主机端口的TCP连接。 如果省略host,则假定为“localhost”。 connectListener参数将添加为“connect”事件的侦听器。 它是一个返回新的’net.Socket’的工厂方法。
  • net.connect(path[, connectListener]):创建到路径的Unix套接字连接。 connectListener参数将添加为“connect”事件的侦听器。 它是一个返回新的’net.Socket’的工厂方法。
  • net.createConnection(path[, connectListener]):创建到路径的Unix套接字连接。 connectListener参数将添加为“connect”事件的侦听器。 它是一个返回新的’net.Socket’的工厂方法。
  • net.isIP(input):测试输入是否为IP地址。 对于无效字符串,返回0,对于IP版本4地址,返回4,对于IP版本6地址,返回6。
  • net.isIPv4(input):如果输入是版本4 IP地址,则返回true,否则返回false。
  • net.isIPv6(input):如果输入是版本6 IP地址,则返回true,否则返回false。

25.2. 类 – net.Server

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

25.2.1. 方法

  • server.listen(port[, host][, backlog][, callback]):开始接受指定端口和主机上的连接。 如果省略主机,则服务器将接受指向任何IPv4地址(INADDR_ANY)的连接。 端口值为零将分配随机端口。
  • server.listen(path[, callback]):启动本地套接字服务器,侦听给定路径上的连接。
  • server.listen(handle[, callback]):handle对象可以设置为服务器或套接字(具有底层_handle成员的任何东西)或{fd:}对象。 它将使服务器接受指定句柄上的连接,但假定文件描述符或句柄已绑定到端口或域套接字。 Windows不支持侦听文件描述符。
  • server.listen(options[, callback]):选项的端口,主机和积压属性以及可选的回调函数的行为与调用server.listen(port,[host],[backlog],[callback])时的行为相同。 或者,path选项可用于指定UNIX套接字。
  • server.close([callback]):最后在所有连接结束并且服务器发出“关闭”事件时关闭。
  • server.address():返回操作系统报告的绑定地址,服务器的地址系列名称和端口。
  • server.unref():如果这是事件系统中唯一的活动服务器,则在服务器上调用unref将允许程序退出。 如果服务器已经unfd,那么再次调用unref将无效。
  • server.ref():与unref相反,在以前未刷新的服务器上调用ref将不会让程序退出,如果它是唯一的服务器(默认行为)。 如果服务器已重新启动,则再次调用ref将不起作用。
  • server.getConnections(callback):异步获取服务器上的并发连接数。 套接字被发送到分叉时工作。 回调应该有两个参数错误和计数。

25.2.2. 事件

  • listening:在调用server.listen后绑定服务器时发出。
  • connection:在建立新连接时发出。 Socket对象,连接对象可用于事件处理程序。 Socket是net.Socket的一个实例。
  • close:服务器关闭时发出。 请注意,如果存在连接,则在所有连接结束之前不会发出此事件。
  • error:发生错误时发出。 此事件后将直接调用 close 事件。

25.3. 类 – net.Socket

此对象是TCP或本地套接字的抽象。 net.Socket实例实现双工Stream接口。 它们可以由用户创建并用作客户端(使用 connect()),也可以由Node创建,并通过服务器的“连接”事件传递给用户。

25.3.1. 事件

net.Socket是一个eventEmitter,它会发出以下事件。

  • lookup:解析主机名后但在连接之前发出。 不适用于UNIX套接字。
  • connect:成功建立套接字连接时发出。
  • data:收到数据时发出。 参数数据将是Buffer或String。 数据编码由 socket.setEncoding() 设置。
  • end:当套接字的另一端发送FIN数据包时发出。
  • timeout:如果套接字因不活动而超时,则发出。 这只是为了通知套接字已空闲。 用户必须手动关闭连接。
  • drain:写缓冲区变空时发出。 可用于限制上传。
  • error:发生错误时发出。 此事件后将直接调用 close 事件。
  • close:插座完全关闭后发出。 参数 had_error 是一个布尔值,表示套接字是否由于传输错误而关闭。

25.3.2. 属性

net.Socket提供了许多有用的属性,可以更好地控制套接字交互。

  • socket.bufferSize:此属性显示当前要写入的缓冲字符数。
  • socket.remoteAddress:远程IP地址的字符串表示形式。 例如,74 .125.127.1002001:4860:a005 :: 68
  • socket.remoteFamily:远程IP系列的字符串表示形式。 IPv4IPv6
  • socket.remotePort:远程端口的数字表示形式。 例如,80或21。
  • socket.localAddress:远程客户端连接的本地IP地址的字符串表示形式。 例如,如果您正在侦听 0.0.0.0 并且客户端连接 192.168.1.1,则值将为 192.168.1.1
  • socket.localPort:本地端口的数字表示形式。 例如,80或21。
  • socket.bytesRead:接收的字节数。
  • socket.bytesWritten:发送的字节数。

25.3.3. 方法

  • new net.Socket([options]):构造一个新的套接字对象。
  • socket.connect(port[, host][, connectListener]):打开给定套接字的连接。 如果给出了端口和主机,则套接字将作为TCP套接字打开,如果省略host,则假定为localhost。 如果给出了路径,则套接字将作为Unix套接字打开到该路径。
  • socket.connect(path[, connectListener]):打开给定套接字的连接。 如果给出了端口和主机,则套接字将作为TCP套接字打开,如果省略host,则假定为localhost。 如果给出了路径,则套接字将作为Unix套接字打开到该路径。
  • socket.setEncoding([encoding]):将套接字的编码设置为可读流。
  • socket.write(data[, encoding][, callback]):在套接字上发送数据。 第二个参数指定字符串的编码 – 默认为UTF8编码。
  • socket.end([data][, encoding]):半关闭套接字,即它发送FIN数据包。 服务器可能仍会发送一些数据。
  • socket.destroy():确保此套接字上不再发生I/O活动。 仅在出现错误(解析错误等)时才需要。
  • socket.pause():暂停读取数据。 也就是说,不会发出’数据’事件。 用于限制上传。
  • socket.resume():在暂停()调用后恢复阅读。
  • socket.setTimeout(timeout[, callback]):在套接字上的超时毫秒不活动后,将套接字设置为超时。 默认情况下,net.Socket没有超时。
  • socket.setNoDelay([noDelay]):禁用Nagle算法。 默认情况下,TCP连接使用Nagle算法,它们在发送数据之前缓冲数据。 对noDelay设置为true将在每次调用 socket.write() 时立即触发数据。 noDelay默认为true。
  • socket.setKeepAlive([enable][, initialDelay]):启用/禁用保持活动功能,并可选择在空闲套接字上发送第一个keepalive探针之前设置初始延迟。 启用默认值为false。
  • socket.address():返回操作系统报告的绑定地址,地址系列名称和套接字端口。 返回具有三个属性的对象,例如 {port:12346,family:’IPv4’,address:’127.0.0.1′}
  • socket.unref():如果这是事件系统中唯一的活动套接字,则在套接字上调用unref将允许程序退出。 如果套接字已经unfd,则再次调用unref将不起作用。
  • socket.ref():与unref相反,在先前未刷新的套接字上调用ref将不会让程序退出,如果它是唯一的套接字(默认行为)。 如果套接字是refd,那么再次调用ref将不起作用。

25.4. 示例

使用以下代码创建名为server.js的js文件:

var net = require('net');
var server = net.createServer(function(connection) { 
   console.log('client connected');
   connection.on('end', function() {
      console.log('client disconnected');
   });
   connection.write('Hello World!\r\n');
   connection.pipe(connection);
});
server.listen(8080, function() { 
   console.log('server is listening');
});

现在运行server.js来查看结果:$ node server.js。验证输出:server is listening。使用以下代码创建名为client.js的js文件:

var net = require('net');
var client = net.connect({port: 8080}, function() {
   console.log('connected to server!');  
});
client.on('data', function(data) {
   console.log(data.toString());
   client.end();
});
client.on('end', function() { 
   console.log('disconnected from server');
});

现在从另一个终端运行client.js以查看结果:$ node client.js。验证输出:

connected to server!
Hello World!
disconnected from server

验证运行server.js的终端上的输出:

server is listening
client connected
client disconnected
下一节:Node.js dns模块用于执行实际的DNS查找以及使用基础操作系统名称解析功能。