nodeJS - 9 - NET HTTP 网络模块

news/2024/5/17 18:51:10 标签: api, nodejs, http, net, tcp
http://www.w3.org/2000/svg" style="display: none;">

net-模块http-模块">Net 模块、HTTP 模块

参考

  • Node.js 文档
  • JavaScript 标准参考教程 Node.js

net-模块">Net 模块

net 模块用于底层的网络通信,提供了基于流的 TCP 或 IPC 服务器和客户端的 API

TCP 服务在网络应用中十分常见,目前大多数应用都是基于 TCP 搭建的,TCP 的首要特性就是它是面向连接的。

netserver-类">net.Server 类

用于创建 TCP 或 IPC server

server 实例属性和方法

  1. address() 返回服务器的地址,包括 port 端口号;family: ip版本;address: ip地址
  2. close() 方法,停止接受建立新的 connection ,如果 close 之前存在 connection 将会保存
  3. getConnections(callback) 方法,获取当前并发连接数,回调函数有两个参数,err: 错误信息;count: 并发数量
  4. listen() 启动一个 server 监听 ,当 server 开始监听,就会触发一个 listening 事件,这个方法的最后一个参数 callback 将会被添加为 listening 事件的监听器,参数 (options[, callback]) options 参数包括 port, host, path 等,也可以通过 listen(path,callback) 监听一个路径,或者通过 listen([port][,host][,callback]) 启动一个 TCP 服务,监听 port 和 host
  5. listening 属性,表明 server 是否正在监听

server 实例的事件

  1. listening 事件,调用 server.listen() 之后触发
  2. connection 事件,当一个新 connection 建立的时候触发,回调参数 socket 对象
  3. error 事件,错误出现的时候触发
  4. close 事件,当 server 关闭时触发,如果 connection 存在,直到所有 connection 结束才会触发
    const net = require('net');

    const PORT = 8867;
    const HOST = '127.0.0.1';

    const clientHandle = function (socket) {
        const {port, address} = socket.address();
        socket.on('data', function (data) {
            console.log(address, port, 'on data');

            socket.write('server is inline');
            app.getConnections(function (error, connections) {
                console.log(connections);
                socket.destroy();
                app.close();
            })
        })
    }

    const app = net.createServer(clientHandle);

    app.listen(PORT, HOST, function () {
        console.log('tcp server running', app.address());
        console.log(app.listening);
    });

    app.on('listening', function () {
        console.log('app is listening at ', app.address());
    })

    app.on('connection', function (socket) {
        console.log('app is connection ', socket);
    })

    app.on('error', function (err) {
        console.log('error', err);
    })

    app.on('close', function () {
        console.log('app is close');
    })

netsocket-类">net.Socket 类

net.Socket 可以被用户创建并直接与 server 通信,在 server 中,当一个链接被接受时,可以通过监听 connection 事件触发而获得,可以使用它来与客户端通信

socket 实例的属性与方法

  1. address() 返回操作系统报告的 socket 地址 address;端口:port;地址族:family
  2. connect() 方法,启动一个链接,参数 (options[, listener]) options 参数包括 port, host, path 等,也可以通过 listen(path[, listener]) 用于 IPC 链接,或者通过 listen([port][,host][,listener]) 启动一个 TCP 链接,返回值是 socket 自身
  3. connecting 属性,true:表示 connect() 方法被调用但还未结束,false:在 connect() 方法回调中会返回 false
  4. destroy() 方法,确保该 socket 上不在有 I/O 活动,一般用在错误部分
  5. destroyed 属性,指示链接是否已经被销毁
  6. end([data][, encoding]) 半关闭 socket,如果指定 data 相当于先调用 write() 方法发送数据,然后再调用 end() 方法
  7. pause() 方法,暂停数据阅读
  8. resume() 方法,继续阅读数据
  9. setEncoding([encoding]) 方法,设置编码
  10. write(data[,encoding],callback) 方法,发送数据
  11. setTimeout(timeout[, callback]) 方法,设置超时时间

socket 实例事件

  1. close 事件,一旦 socket 完全关闭就发出该事件
  2. connect 事件,socket 连接成功时触发
  3. data 事件,接收到数据时触发
  4. end 事件,当 socket 的另一端发送一个 FIN 包的时候触发,从而结束 socket 的可读端
  5. error 事件,当错误发生时触发
  6. timeout 事件,当 socket 超时的时候触发。该事件只是用来通知 socket 已经闲置。用户必须手动关闭。
    const net = require('net');;

    const PORT = 8867;
    const HOST = '127.0.0.1';

    const client = net.Socket();
    client.setEncoding('utf-8');

    client.connect(PORT, HOST, function () {
      console.log('connect success.');

      client.write('tcp client by node');
      client.pause();

      setTimeout(function () {
        client.resume();
      }, 1000)
    })
    console.log('connecting ', client.connecting); //true

    client.on('data', function (data) {
      console.log('received: ', data.toString());
    })

    client.on('connect', function () {
      console.log('address', client.address());
      console.log('connecting ', client.connecting); // false
      console.log('localAddress', client.localAddress);
      console.log('localPort', client.localPort);
      console.log('remoteAddress', client.remoteAddress);
      console.log('remoteFamily', client.remoteFamily);
      console.log('remotePort', client.remotePort);
    })

    client.on('error', function (err) {
      console.log('error', err);
      client.end('ssssss');
      client.destroy();
      console.log('destroyed', client.destroyed);
    })

netcreateconnection">net.createConnection()

一个工程函数,用来创建 net.Socket ,然后立即启动 connect() 方法,最终返回 socket 对象,有三种参数传入方式

  1. net.createConnection(options[, connectListener]) options 与 socket 实例的 connect 方法一致
  2. net.createConnection(path[, connectListener]) 用来连接路径
  3. net.createConnection(port[, host][, connectListener]) 连接 TCP
    const client = net.createConnection(PORT, HOST, function () {
      console.log('connect success.');
    })
    const client = net.createConnection({port: PORT, host: HOST}, function () {
      console.log('connect success.');
    })

netcreateserver">net.createServer()

创建一个 TCP 或者 IPC 服务器,接受两个参数,第一个参数 options 可选, 第二个参数 connectionListener 监听函数,监听 connection

    const app = net.createServer(function (socket) {
        console.log(socket);
    });

netisip">net.isIP()

判断某个字符串是不是ip 地址

    net.isIP('10.0.0.1') // 4
    net.isIP('cats') // 0

http-模块">HTTP 模块

http-模块属性和方法">1. HTTP 模块属性和方法

  1. METHODS 属性,返回解析器支持的 HTTP 方法列表
  2. STATUS_CODES 属性,返回标准的 HTTP 响应状态码集合及描述
  3. createServer([requestListener]) 返回一个新建的 http.Server 实例,参数可以是一个 request 事件处理函数
  4. request(options[, callback]) 用于发出请求,options 可以是一个对象、字符串、或者 URL 对象,callback 参数可选,会作为单次监听器添加到 responce 事件
  5. get(options[,callback]) 因为大多数请求都是 GET 请求且不带请求主体,所以 Node.js 提供了该便捷方法

httpserver-类">2. http.Server 类

继承 net.Server ,创建 服务器实例使用 http.createServer(callback)

1. server 实例的属性与方法

基本上继承了 net.Server 实例的方法与属性

  1. listen() 启动一个 server 监听 ,当 server 开始监听,就会触发一个 listening 事件,这个方法的最后一个参数 callback 将会被添加为 listening 事件的监听器,参数 (options[, callback]) options 参数包括 port, host, path 等,也可以通过 listen([port][,host][,callback]) 监听
  2. listening 返回当前服务器是否正在监听链接
  3. close() 方法,停止服务器端接收新的链接
  4. setTimeout() 方法,设置超时时间
  5. timeout 属性,返回超时时间

2. server 实例的事件

  1. connect 事件,当客户端发送 HTTP CONNECT 请求时触发,回调参数 request: HTTP 请求,同 request 事件;socket: 服务器与客户端之间的网络 socket ; head 流的第一个数据包,可能为空
  2. connection 事件,当一个新的 TCP 流被建立时触发,回调参数 socket
  3. request 事件,每次接收到一个请求时触发,每个链接可能有多个请求,回调参数 request、response
  4. upgrade 事件,每当客户端发送 HTTP upgrade 请求时触发
    const http = require('http');

    const PORT = 8867;
    const HOST = '10.15.32.51';

    const app = http.createServer(function (req, res) {
        res.end('xxx');
    })

    app.listen(PORT, HOST, function () {
        console.log('listen http ', PORT, HOST);
        console.log('app.listening', app.listening);
    })

    app.on('connect', function (req, socket, head) {
        console.log(req);
    })

    app.on('connection', function (socket) {
        console.log('http connect ');
    })

    app.on('request', function (req, res) {
        console.log('on request', res);
    })

    app.setTimeout(12000);
    console.log(app.timeout);

    app.on('timeout', function () {
        console.log('timeout');
    })

httpclientrequest-类">3. http.ClientRequest 类

该对象在 http.request() 内部被创建并返回。 它表示着一个正在处理的请求

1. request 实例的属性与方法

  1. flushHeaders(),刷新请求头
  2. getHeader(name) 获取请求头信息
  3. removeHeader(name) 移除某个请求头信息
  4. setHeader(name, value) 设置请求头信息
  5. setTimeout(timeout[, callback]) 设置请求时长
  6. socket 返回底层 socket 的引用
  7. write(chunk[, encoding][, callback]) 发送请求主体的一个数据块
  8. abort() 标记请求为终止
  9. aborted 如果请求终止则返回被终止的时间
  10. end([data[, encoding]][, callback]) 结束发送请求。 如果部分请求主体还未被发送,则会刷新它们到流中

2. request 实例的事件

  1. abort 事件,当请求已被客户端终止时触发。 该事件仅在首次调用 abort() 时触发。
  2. connect 事件,每当服务器响应 CONNECT 请求时触发,回调参数,response、socket、head
  3. continue 事件,当服务器发送了一个 100 Continue 的 HTTP 响应时触发
  4. response 事件,当请求的响应被接收到时触发。 该事件只触发一次。
  5. socket 事件,当 socket 被分配到请求后触发
  6. timeout 事件,请求超时时触发
  7. upgrade 事件,当服务器响应 upgrade 请求时触发
    const http = require('http');
    const querystring = require('querystring');

    const PORT = 8867;
    const HOST = '10.15.32.51';

    const postData = querystring.stringify({
      'msg' : 'Hello World!'
    });

    const options = {
      hostname: HOST,
      port: PORT,
      method: 'GET',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
      }
    };

    const request = http.request(options, function (res) {
      // console.log(res);
    });

    request.setHeader('TEST', 'test header');
    console.log(request.getHeader('TEST'));
    request.removeHeader('TEST');
    console.log(request.getHeader('TEST'));
    request.flushHeaders();
    request.setTimeout(12000);

    request.on('abort', function () {
      console.log('abort');
    })

    request.on('response', function () {
      console.log('response');
    })

    request.on('timeout', function () {
      console.log('timeout');
    })

    request.write('get somthing');
    request.end('end', function () {
      console.log('request end');
    });

    // request.abort();
    // console.log(request.aborted);

httpcreateserver-方法回调函数中的第一个参数-request-对象的属性方法事件">3. http.createServer() 方法回调函数中的第一个参数 request 对象的属性、方法、事件

属性与方法

  1. req.url 返回发出请求的网址
  2. req.method 返回 http 请求的方法
  3. req.headers 返回 http 请求的头信息
  4. setEncoding() 方法,设置请求的编码
  5. httpVersion 返回链接到的服务器的 http 版本
  6. rawHeaders 返回,接收到的原始的请求头列表

事件

  1. aborted 事件,当请求已被终止且网络 socket 已关闭时触发。
  2. close 事件,当底层连接被关闭时触发。 同 ‘end’ 事件一样,该事件每个响应只触发一次。
  3. data 事件,接收到数据触发,回调参数,接受的数据
    const http = require('http');
    const fs = require('fs');

    const PORT = 8867;
    const HOST = '10.15.32.60';

    const app = http.createServer(function (req, res) {

        req.on('aborted', function () {
            console.log('aborted');
        })

        req.on('close', function () {
            console.log('close');
        })

        console.log(req.url);
        console.log(req.method);
        console.log(req.httpVersion);
        console.log(req.statusCode);
        console.log(req.statusMessage);

        // console.log(req.headers);

        req.on('data', function (postData) {
            console.log(postData.toString());
            res.write('xxx', function () {
                res.end()
            })
        })
    })

    app.listen(PORT, HOST, function () {
        console.log('listen http://' + HOST + ':' + PORT);
        console.log('app.listening', app.listening);
    })

httpserverresponse-类">4. http.ServerResponse 类

该对象在 HTTP 服务器内部被创建。 它作为第二个参数被传入 ‘request’ 事件

1. response 实例属性与方法

  1. setHeader(name, value) 设置响应头的值,如果响应头已存在则会将其覆盖,如要设置多个同名响应头,value 的值可以是字符串数组
  2. hasHeader(name) 返回是否含有某个响应头
  3. getHeaderNames() 返回一个包含当前 http 头信息名称数组,均为小写
  4. getHeaders() 返回当前响应头文件的浅拷贝
  5. getHeader(name) 返回某个响应头信息
  6. headersSent 返回响应头是否被发送
  7. removeHeader(name) 移除响应头
  8. statusCode 属性,设置发送给客户端的状态码
  9. statusMessage 属性,控制发送给客户端的状态信息,默认为状态码的标准信息
  10. write(chunk[,encoding][,callback]) 方法,可以被多次调用,用于设置返回的响应主体
  11. writeHead(statusCode[, statusMessage][, headers]) 发送响应头,包括状态码和状态描述,只能被调用一次,会与 通过 response.setHeader() 设置的响应头合并
  12. setTimeout(msecs[, callback]) 设置超时时间
  13. finished 属性,表示响应是否已完成
  14. end([data][,encoding][,callback]) 通知服务器所有响应头和响应主体都已被发送,每次响应都必须调用

2. response 实例事件

  1. close 事件,end() 方法调用后触发
  2. finish 事件,当响应头与响应主体的最后一部分已被交给操作系统网络进行传输时触发,并不意味着客户端已经接受任何东西
    const http = require('http');
    const fs = require('fs');

    const PORT = 8867;
    const HOST = '10.15.32.60';

    const app = http.createServer(function (req, res) {

        res.on('close', function () {
            console.log('close');
        })

        res.on('finish', function () {
            console.log('finish');
        })

        res.setHeader('TEST', ['test1', 'test2']);
        console.log(res.hasHeader('TEST'));
        console.log(res.getHeaderNames());
        console.log(res.getHeaders());
        console.log(res.getHeader('TEST'));
        console.log(res.headersSent);

        res.removeHeader('TEST');
        console.log('remove', res.hasHeader('TEST'));
        res.writeHead(222, 'write head statue message', {
            'TEST2': 'this is test header'
        });

        res.statusCode = 200;
        res.statusMessage = 'test status message';
        res.setTimeout(10000);

        fs.readFile('./package.json', function (err, data) {
            res.write(data, function () {
                console.log('data write success');
                res.end('xnxnxn');

                console.log(res.finished);
            })
        })

    })

    app.listen(PORT, HOST, function () {
        console.log('listen http://' + HOST + ':' + PORT);
        console.log('app.listening', app.listening);
    })

http://www.niftyadmin.cn/n/661095.html

相关文章

计算机视觉中的数学方法——3.3 恢复平面景物的几何结构

3.3 恢复平面景物的几何结构3.3.1 仿射结构(无穷远直线)3.3.2 相似结构(圆环点)3.3.3 绝对欧氏结构如何辨认圆环点的图像呢?3.3.1 仿射结构(无穷远直线) 3.3.2 相似结构(圆环点&…

计算机视觉中的数学方法——4两视点几何——4.1 基本矩阵

4.1 基本矩阵4.1.1 极几何(相关名词解释)极几何约束4.1.2 基本矩阵 F基本矩阵(点到极线)基本矩阵的自由度基本矩阵的性质☆☆☆例子极线对应(利用基本矩阵描述极线间的对应关系)纯平移运动下的基本矩阵&…

计算机视觉中的数学方法——4.2 单应矩阵

4.2 单应矩阵4.2.1 单应矩阵无穷远单应(无穷远平面所诱导)4.2.2 单应矩阵与基本矩阵的关系各种条件下的基本矩阵计算公式4.2.3 不动点与不动线纯平移运动相对单应矩阵4.2.1 单应矩阵 两幅图像单应变换 极点单应变换 平面π诱导的两个摄像机间的单应矩阵…

javascript语句

前面的话 默认情况下,javascript解释器依照语句的编写顺序依次执行。而javascript中的很多语句可以改变语句的默认执行顺序。本文介绍可以改变语句默认执行顺序的条件语句、循环语句和跳转语句 条件语句 脚本的威力体现在它们可以根据人们给出的各种条件做出决策&am…

微信网页授权接口调用实例解析

工欲善其事必先利其器,想要开始相关操作,首先要鼓捣个公众号,至于公众号怎么注册这里不多说。我们先来配置一个测试账号用于测试微信的相关接口。 首先:登录自己的公众号后选择开发---》开发工具,如图 其次&#xff1a…

计算机视觉中的数学方法——4.3 基本矩阵估计

4.3 基本矩阵估计4.3.1 8-点算法(8-Point Algorithm)基本矩阵的秩 2 约束8-点算法4.3.2 最小点对应算法7-点算法6-点算法4.3.1 8-点算法(8-Point Algorithm) 当点对应精确时,rank(A)8,f 是矩阵A的零空间,或者说是矩阵A的零特征值对应的特征向…

计算机视觉中的数学方法——4.4 恢复摄像机矩阵

4.4 恢复摄像机矩阵4.4.1 射影相关基本矩阵与射影相关类及相关性质例子4.4.2 摄像机矩阵的恢复4.4.1 射影相关 所谓射影相关实际上就是摄像机对之间的射影变换。 讲一个摄像机对映射为另一个摄像机对。 基本矩阵与射影相关类及相关性质 图像上的对应点相同 例子 从P&am…

2017.8.23

牛客网C练习 1.(1)派生类中的基类子对象和子对象必须初始化,初始化在派生类的构造函数的初始化列表中,如果初始化列表中没有进行初始化,则调用缺省的构造函数进行初始化。(2)派生类构造函数的调用顺序:基类的构造函数子对象类的构…