• nodejs的某些api~(三)net模块


    net模块和http模块是node最重要的两个模块,前者是基于TCP的封装,后者的本质也是TCP。他们通过 tcp通信,建立一个可以收发消息的web服务器。我在写的作品里面用的express也是封装的http的模块,本质都是一样的。


    net建立TCP服务器,传入可选options配置信息。

    net.createServer([options], [connectionListener])
    //创建一个新的TCP服务器参数connectionListenner会被自动作为connection事件的监听器
    options:{allowHalfOpen: false}如果允许半开连接,为true,当另一端的套接字发送FIN报文时套接字并不会自动发送FIN。套接字会变得不可读,但可写,应当调用end();

    var net=require('net');
    var server=net.createrSever(function(c){
        console.log('服务区已连接');
        c.on('end',function(){
              console.log('服务器断开');
         })
        c.write('hello
    ');
        c.pipe(c);
    }).listen(3000,function(){
         console.log('服务器绑定在3000端口');
    })

    一个简单的例子,向连接的客户端写入hello。值得一提的是net是一个stream流,巧用pipe,将输入写到输出,实际等于:

    c.on("data",function(data){
       c.write(data); 
    })
    c.on("end",function(){
       c.end(); 
    })

    net.connect(options,[connectionListener]),net.createConnection(options,[connectionListener]);

    构建一个新的套接字对象并打开所给位置的套接字,当套接字就绪时会触发“connect”事件
    options:{
      port:客户端连接到的端口,
      host:客户端连接到的主机,缺省为localhost
      localAddress:网络连接绑定的本地接口,
      family:IP栈版本,缺省为4
    }

    var net=require('net')
    var client=net.connect({port:3000},function(){
        console.log('客户端已连接');
        client.write('word
    ');
    })
    client.on('data',function(data){
        console.log(data.toString());
        client.end();
    })
    client.on('end',function(){
        console.log('break up');
    })

    类net.server 用于创建一个TCP或UNIX服务器,服务器本质上是一个可监听传入连接的net.Socket
    server.listen(port,[host],[backlog],[callback]);
    在指定端口port的主机host上开始接受连接,如果省略host则服务器会接受所有来自IPV4地址的连接,端口为0,则会使用分随机分配的端口
    backlog为连接等待队列的最大长度
    这是一个异步函数,当服务器被绑定时会触发listening事件,最后一个参数callback会被做listening事件的监听器

    server.on('error',function(e){
        if (e.code=='EADDRINUSE') {
            console.log('地址被占用,重试中……');
            setTimeout(function(){
                server.close();
                server.listen(PORT,HOST)
            }, 1000);
        };
    }) 

    server.close([callback]);停止服务器接收新连接,但保持已有连接。是一个异步函数,服务器在所有连接结束后关闭,并发送close事件;
    server.address()返回操作系统报告的绑定的地址,协议族和端口。对查找操作系统分配的地址哪个端口已被分配非常有用
    server.unref()如果这是事件系统中唯一一个活动的服务器,调用unref将允许程序退出,如果服务器已被unref,再次调用无影响
    server.ref()如果这是仅剩的服务器,在一个之前被unref的服务器上调用ref将不会让程序退出;
    server.maxConnections这个选项能在服务器连接数超过数量时拒绝连接
    server.getConnections(callback)异步获取服务器当前活跃的连接数,用于套接字被发给子进程;回调传入err,count两参数

    事件listening,在服务器调用server.listen绑定后触发
    事件connection在一个新连接被创建时触发,socket是一个net.socket的实例
    事件close服务器被关闭时触发
    事件error当错误发生时触发 

    类net.Socket
    ·这个对象是一个TCP或UNIX套接字的抽象。net.Socket实例实现了一个双工流接口。
    ·他们可以被用户使用在客户端(使用connect())或者由node创建;通过connection服务器事件传递给用户

    new net.Socket([options]) //构造一个新的套接字对象
    { fd: null  //options对象
    type: null 
    allowHalfOpen: false}

    socket.connect(port,[host],[connectListener]) //使用传入的套接字打开一个连接 如果port和host都被传入,那么套接字将会倍已TCP套接字打开。
    socket.connect(path,[connectListener])
    //socket.bufferSize 是一个net.Socket的属性,用于socket.write()用于帮助用户获取更快的运行速度。
    //socket.setEncoding([encoding])
    //socket.write(data,[encoding],[cb])在套接字上发送数据
    //socket.end([data],[encoding])半关闭套接字
    //soclet.destroy()确保没有i/o活动在这个套接字。只用在错误发生情况下需要
    //socket.pause()暂停读取。“data”事件不会被触发。对于控制上传非常有用
    //socket.resume()在调用pause()后恢复读操作
    //socket.setTimeout(timeout,[cb])如果套接字超过timeout毫秒数处于闲置状态,则超时,套接字会接受到一个'timeout'事件,但连接不会断开,除非手动end(),destroy()
    ·callback参数将会被添加成为'timeout'事件的一次性监听器
    //socket.setNoDelay([noDelay])//禁用nagle算法;
    //socket.setKeepAlive([enable],[initialDelay]) 禁用/启用长连接功能;enable默认为false,
    事件lookup ·这个事件在解析主机名之后,连接主机之前被分发。对UNIX套接字不适用。
    事件connect
    事件data收到数据被分发。data参数会是一个buffer或string对象。
    事件end套接字的另一端发送FIN包时,该事件被分发。
    事件timeout
    事件drain 当写入缓冲被清空时产生。课被用于控制上传流量
    事件error close
    net.isIP(input)测试input是否为ip地址,无效字符串返回0;
    net.isIPv4(input); net.isIPv6(input);返回true or false

    罗列一下node api,有需要瞅两眼

  • 相关阅读:
    【非技术】谈谈业务6W+H
    WinForm二三事(三)Control.Invoke&Control.BeginInvoke
    企业应用架构模式读书笔记(一)
    WinForm二三事(四)界面布局(上)
    WinForm二三事(二)异步操作
    WinForm二三事(一)消息循环
    白话基础之虚拟存储器
    不清楚自己的位置,会走很多弯路
    WinForm二三事(一)补遗
    技术、业务、市场
  • 原文地址:https://www.cnblogs.com/dh-dh/p/5087421.html
Copyright © 2020-2023  润新知