• node.js网络(net)


    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
    ');
    }).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()} `);
            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);
        });
    });
  • 相关阅读:
    VS2010的新特性:3.新要害词 Dynamic
    VS2010的新特性:1.可选参数
    VS2010的新特性:4.简化了对 Office API 对象的访问
    VS2010的新特性:2.命实参数
    Not beside my body,but inside my heart!
    Tears...
    首乘“子弹头”列车
    What doesn't kill me makes me stronger!
    HongKong Business Trip
    胃部不适,原来好辛苦!
  • 原文地址:https://www.cnblogs.com/xtxt1127/p/12728315.html
Copyright © 2020-2023  润新知