zoukankan      html  css  js  c++  java
  • 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);
        });
    });
  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/xtxt1127/p/12728315.html
Copyright © 2011-2022 走看看