net(网络)

net.Server 类#

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

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

  • 返回: <net.Server>

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

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

'close' 事件#

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

'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])#

  • 返回: <net.Server>

停止 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 <net.Server>

异步获取服务器的当前并发连接数。当 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);
  }
});



______________________________________________________________________________________________________________________



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 <Object> 可用选项有:
    • fd: <number> 如果指定了该参数,则使用一个给定的文件描述符包装一个已存在的 socket,否则将创建一个新的 socket。
    • allowHalfOpen <boolean> 指示是否允许半打开的 TCP 连接。详情查看 [net.createServer()][] 和 ['end'][] 事件。默认是 false
    • readable <boolean> 当传递了 fd 时允许读取 socket,否则忽略。默认 false
    • writable <boolean> 当传递了 fd 时允许写入 socket,否则忽略。默认 false
  • Returns: <net.Socket>

新创建的 socket 可以是 TCP socket 也可以是 [IPC][] 端点流,取决于它连接 [connect()][socket.connect()] 到什么。

'close' 事件#

  • had_error <boolean> 如果 socket 有传输错误就为 true。

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

'connect' 事件#

'data' 事件#

当接收到数据的时触发该事件。data 参数是一个 BufferString。数据编码由 socket.setEncoding() 设置。(在 [Readable Stream][] 章节查看更多信息。)

注意当 Socket 发送 data 事件的时候,如果没有监听者数据将会丢失

 

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

在 socket 上发送数据。第二个参数制定了字符串的编码 - 默认是 UTF8 编码。

如果全部数据都成功刷新到内核的缓冲则返回 true。如果全部或部分数据在用户内中排队,则返回 false。当缓冲再次空闲的时候将触发 ['drain'][] 事件。

当数据最终都被写出之后,可选的 callback 参数将会被执行 - 可能不会立即执行。

_________________________________________________________________

 

node.js中net模块为我们提供了TCP服务器和客户端通信的各种接口。

 

一、创建服务器并监听端口

const net = require('net');
 
//创建一个tcp服务
//参数一表示创建服务的一些配置
//参数二表示 事件 'connection' 监听回调函数
let server = net.createServer({
    //表示是否允许一个半开的TCP连接,默认为false
    allowHalfOpen: false,
    //一旦来了连接,是否暂停套接字,默认为false
    pauseOnConnect: false
});
 
server.listen(6666);
 
//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {
    //注意这里的socket是一个流,既可以读,也可以写
    //当我们监听 'data' 事件后,系统就会不断的从流中读取数据
    socket.on('data', function (data) {
        console.log('服务器接收到 : ', data.toString());
    });
});
 
//服务调用 server.listen() 监听后就会触发该事件
server.on('listening', function () {
    // address() 方法返回服务器地址信息对象
    let addr = server.address();
    console.log(`服务器监听 : ${addr.port} 端口`);
});
 
//服务关闭时触发,如果还有连接存在,则直到所有连接结束才会触发该事件
server.on('close', function () {
    console.log('服务关闭');
});
 
//出现错误时触发
server.on('error', function (err) {
    console.log(err);
});
 
___________________________________________________________
 
我们也可以使用 close() 手动的拒绝所有连接请求,当已连接的客户端都关闭后,则服务器会自动关闭,并触发 'close' 事件。
const net = require('net');
 
let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {
    console.log('服务器监听开始');
});
 
//一个新的连接建立时触发 'connection' 事件
server.on('connection', function (socket) {
    //获取当前服务器的连接数
    server.getConnections(function (error, count) {
        console.log('当前服务器的连接数 : ', count);
    });
 
    socket.on('data', function (data) {
        console.log('服务器接收到 : ', data.toString());
    });
});
 
server.on('close', function () {
    console.log('服务器被关闭');
});
 
//5秒后手动关闭服务器,拒绝所有连接请求,已有连接全部关闭后,触发 'close' 事件
setTimeout(function () {
    server.close();
}, 5000);
 
 
 
________________________________________________________________________________________________________________
 
二、net.Socket是一个socket端口对象,是一个全双工的可读可写流
const net = require('net');
 
let server = net.createServer();
server.listen(6666, '0.0.0.0', function () {
    console.log('服务器监听开始');
});
 
server.on('connection', function (socket) {
    //获取当前服务器的连接数
    server.getConnections(function (error, count) {
        console.log('当前服务器的连接数 : ', count);
    });
 
    console.log('客户端信息 : ', socket.address());
 
    //接收到数据时触发
    socket.on('data', function (data) {
        //我们可以从流中读取数据
        console.log('服务器接收到 : ', data.toString());
        console.log('累计接收的数据大小 : ', socket.bytesRead);
        console.log('累计发送的数据大小 : ', socket.bytesWritten);
 
        //也可以向流中写入数据
        let flag = socket.write(`服务器向你发送 : ${data.toString()} \r\n`);
        console.log('flag : ', flag);
        console.log('当前已缓冲并等待写入流中的字节数 : ', socket.bufferSize);
    });
 
    //连接关闭时触发
    socket.on('end', function () {
        console.log('客户端关闭');
    });
 
    //连接完全关闭时触发
    socket.on('close', function () {
        console.log('客户端完全关闭');
    });
 
    //发生错误时触发
    socket.on('error', function (err) {
        console.log(err);
    });
});