Node.js从无到有-No.4(HTTP基础)

1、HTTP基础学习

1、什么是HTTP,简单的说就是网络协议,计算机之间只有遵循这样的协议彼此之间才能通信。

2、这个协议的具体使用流程简单的说是这样的:

(1)HTTP客户端发起请求,创建端口(比如在手机浏览器打开某个网页,就创建了连接服务器的一个默认80端口,形成了TCP连接)

(2)HTTP服务器就在那个端口去监听用户的请求

(3)HTTP服务器向客户端返回状态(比如200成功的状态码)和内容

3、现在我们在浏览器中打开一个网址,在很短的时间里页面就会渲染出来,但是就是在这么短的时间里计算机和浏览器之间做了很多的事情,现在我们逐一理清一下过程(打开一个www.imooc,com网址)。

(1)域名解析:1、chrome会首先搜索自身的DNS缓存(chrome://net-internals/#events)。

                          2、浏览器没有找到缓存或者缓存失效,则搜索操作系统自身的DNS缓存(这里的DNS缓存按照百度的说法就是                                 因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直                                          接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析)。

                          3、读取本地的HOST文件

                          4、浏览器发起一个DNS的一个系统调用

                                ->宽带运营商服务器查看本身的缓存

                                ->运营商服务器发起一个迭代DNS解析的请求(首先去找根域的IP地址,DNS服务器会返回一个com域的                                                                                                           顶级域的IP地址,然后运营商会向com域的DNS服务器询                                                                                                           问,com域的DNS服务器会返回imooc.com域的IP地                                                                                                                址,最后在imooc.om域的DNS服务器中找到IP地址)

                                ->找到了IP地址,发送给运营商的DNS服务器,运营商服务器把结果返回给操作系统内核同时缓存起来

                                ->操作系统内核将结果返回到浏览器

                          5 、浏览器获得域名对应的IP地址后,发起HTTP经典的三次握手

                               ->浏览器就会以一个随记的端口向服务器的web程序发起TCP请求,最终实现TCP和IP的连接。

                          6、TCP/IP 连接后,浏览器就可以向服务器发送HTTP请求了。

                          7、服务器接受到了这个请求,根据路径参数,经过后端的一些处理,将结果返回浏览器

                          8、浏览器将结果呈现给用户(在返回结果中向图片,静态资源这些还属于一些HTTP请求,就仍然要进行上                                     述7个步骤)

4,请求和响应都包括http头和正文信息,http头发送的是一些附加的信息:内容类型,服务器发送响应日期,HTTP状态码,正文就是用户提交的表单数据

5、现在我们去一个具体的网址,在浏览器打开控制台,看看里面的内容,打开控制台然后刷新一下页面,就会在控制台的network中显示很多请求的资源文件。下图所示:


我们从Timing来解释其中的一个个参数的意思

(1)stalled:等待时间,浏览器要发出请求到可以发出请求的这段时间,但是并不包括DNS缓存查询和TCP/IP链接时间

(2)Request sent:请求时间或者发送时间,第一个字节发出之前到最后一个字节发出之后的时间

(3)Waiting:等待时间,就是发送请求到收到响应的时间

(4)content Download:就是下载时间,收到响应的第一个字节到最后一个字节的时间

然后我们再到Header中看看


在General中的这些参数都是一些最基本的参数,请求的地址,请求的方法,状态码,远端IP地址等等

6、关于请求方法在http协议1.1中定义了8个方法,GET,POST,PUT,DELETE,HEAD,TRACE,OPTIONS

(1)GET:获取数据,比如我们要获取完整的html页面等等

(2)POST:向指定的资源去提交数据,比如我们新建用户,上传视频等等

(3)PUT:向指定资源去更新内容,上传一个用户的头像

(4)DELETE:请求服务器去删除我们标识的某个资源

7、关于状态码,是远端服务器返回浏览器请求的状态,一般是三位数,第一个数字定义响应的类别,有五种

1XX:请求已经接受,请继续处理

2XX:请求已经成功接受并处理掉了

3XX:重新定项,就是这个请求还需要进一步处理

4XX:客户端错误,语法错误啊,无法实现等等

5XX:服务端错误

常用的状态码有200、400、401、403、404、500、503,具体的状态码遇到了可以百度定义。

2、http事件回调进阶

1、什么是回调? 

      回调是异步编程最基本的方法,在node.js来说,需要按顺序执行异步逻辑的时候一般采用后续传递的方式,也就是将后续逻辑封装在回调函数中,作为起始函数的参数,逐层去嵌套。通过这样的方式,按照我们的逻辑走完整个流程。知道callback就大概明白了

在文件中写这样一个

function learn(something){
    console.log(something)
}

function we(callback,something){
    something+=' is cool'
    callback(something)
}

we(learn,'Node.js')

然后在命令行中去执行这个文件


2、什么是异步/同步

同步呢,就是执行任务,后一个任务等待前一个任务执行完再执行,程序的执行顺序和任务的排列顺序是一致的,那像在浏览器中的js代码就是单线程的,即使是js文件可以并行下载,但也是顺序执行。

异步呢,就是程序的执行顺序和任务的排列顺序不一致,前一个任务执行完不是执行后一个任务,而是执行回调函数,后一个任务也不是要等到前一个任务完成后才开始执行。最明显的异步函数就是settimeout,接受一个回调函数作为第一个参数,接受一个毫秒时间作为第二个参数

3、什么是单线程,什么是多线程

简单的说,单线程就是一次只能执行一个任务,就好比在一段时间里你只谈一个对象,多线程就是同时执行好几个任务,对应的就是一段时间里你谈了多个女朋友(王八蛋)。

4、什么是I/O?

这个就是磁盘的写入和读出,在Node.JS中本质就是为文件系统,数据库这些资源提供接口,像文件系统请求,当硬盘准备好时,非阻塞接口会通知node

5、什么是阻塞和非阻塞

简单的说阻塞就是将自己挂起,好比打电话问老板有没有位置,老板说你等几分钟我查查,于是你就一直在电话前等着,什么都不干,非阻塞就好比打电话问老板你们有没有位置,老板说你先等会,查完回你电话,于是你就挂了电话,该干嘛干嘛去了。在单线程的node.js中通过回调的方式来进行异步编程,达到非阻塞的效果。那么node.js中回调函数什么时候被调用,就要讲讲事件了

6、什么是事件和事件驱动

简单的说就是一个动作触发一个回调函数,可以结合下面这个解释来理解


在上图中有个很重要的概念就是事件循环,如果存在大量的异步操作,或者I/O的耗时或者延时操作,它们在完成的时候都要去调用响应的回调函数,从而完成一些密集的任务,又不会阻塞整个任务的流程,这么多事件需要用事件循环机制来管理,当异步函数发生的时候,回调函数就会被压入这队列,队列是先进先出,那么回调函数的顺序就会按照异步函数的顺序来执行。

对于Node.js有很多内置的事件,我们能通过引入events模块,并通过EventEmitter来邦定和监听事件

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

下面我们就能通过这个eventEmitter对象来邦定事件和触发事件;

eventEmitter.on('eventName', eventHandler);

上面这一行代码的意思就是,当eventName事件发生后,eventHandler这个回调函数就会被使用来响应或者处理事件的

打个很不恰当的比喻,eventEmitter.on('恐怖分子暴乱事件',Handler),这个Handler函数中的内容就是,抓住暴露头目法律处理,杀鸡儆猴,很明显事件发生,Handler随之发生。

eventEmitter.emit('eventName');

上一行代码表示触发这个事件,随之运行的就是这事件对应的处理器。

下面我们用一个很重要的列子来看看程序的执行顺序,注释表示执行的顺序,这下回调的顺序一目了然

var events = require('events');                     // 1
var eventEmitter = new events.EventEmitter();       // 2
var connectHandler = function connected() {         // 6
   console.log('连接成功。');
   eventEmitter.emit('data_received');
}

eventEmitter.on('connection', connectHandler);      //3
eventEmitter.on('data_received', function(){        //4  7
   console.log('数据接收成功。');
});
eventEmitter.emit('connection');                    // 5

console.log("程序执行完毕。");                       // 8
尽管阻塞,非阻塞,异步同步这些概念很虚,但是学习并理解它十分有必要


猜你喜欢

转载自blog.csdn.net/weixin_37968345/article/details/80751830