http.Server 类(重中之重,web服务器之核心)

618 阅读2分钟

http.server是一个基于事件(events)的HTTP服务器,所有的请求都被设置了触发器,我们只需要设置对应监听器就可以实现HTTP服务器的所有功能,以下内置的触发器:

  • request:当客户端请求到来的时候,该事件被触发,提供两个参数request和response,分别是http.ServerRequest和http.ServerResponse表示请求和响应的信息。
  • connection:当TCP建立连接的时候,该事件被触发,提供了一个参数socket,为net.socket的实例(底层协议对象)
  • close:当服务器关闭的时候会被触发
  • 除此之外还有checkContinue、upgrade、clientError等事件

我们最常用的还是request事件,http也给这个事件提供了一个捷径:http.createServer([requestListener])

以下使简单的使用

const http = require('http');

let server = new http.Server();
server.on('request', (req, res) => {
  console.log(req.url);
  //设置应答头信息
  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.write('hello we are family<br>');
  res.end('server already end\n');
});
//显示了三次这也证明了TCP的三次握手
server.on('connection', () => {
  console.log('握手');
});
server.on('close', () => {
  console.log('server will close');
});
//关闭服务为了触发close事件
server.close();
server.listen(8080);

// 或者用更为简便的方式
http.createServer(function(req,res){
    res.writeHead(200,{'Content-Type':'text/plain'})
    res.write("hi, from aicoder.com");
    res.end();
}).listen(3000);

我们都知道HTTP请求分为两部分:请求头和请求体,如果请求的内容少的话就直接在请求头协议完成之后立即读取,请求体可能相对较长一点,需要一定的时间传输(比如传送了一个1G的压缩包)。

因此提供了三个触发器用于控制请求体传输.(req实例触发的啦)

  1. data:当请求体数据到来时,该事件被触发,该事件一共一个参数chunk,表示接受到的数据。

  2. end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据到来。

  3. close:用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close。

我们再看看req的一些属性:

名称 含义
complete 客户端请求是否已经发送完成
httpVersion HTTP协议版本,通常是1.0或1.1
method HTTP 请求方法,如:GET,POST
url 原始的请求路径
headers HTTP请求头
trailers HTTP请求尾(不常见)
connection 当前HTTP连接套接字,为net.Socket的实例
socket connection属性的别名
client client属性的别名



接下来看个实例理一理:

http.createServer(function(req,res){
    console.log(req.httpVersion);
    //console.log(req.socket);
    console.log(req.headers);
    console.log(req.method);
    res.writeHead(404,{'Content-Type':'text/plain'})
    res.write("we are is content");
    res.end();
}).listen(8080);

我们之前说过,可能post会上传一个很大的文件,我们需要去手动的处理他,node并不会帮助我们默认处理,防止导致恶意上传。

// 获取post请求数据
const http = require('http');
const util = require('util');
const querystring = require('querystring');

http.createServer((req, res) => {
    let post = '';
    req.on('data', chunk => {
      post += chunk;
    });
    req.on('end', () => {
      post = querystring.parse(post);
      res.end(util.inspect(post));
    });
  })
  .listen(3000);
以上教程均来自 https://www.cnblogs.com/fly_dragon/p/8836888.html  FlyDragon老师,致敬。

有缘会再次分析官网的文档的一些api的表示内容。