HTTP请求报文
一个HTTP请求报文有 请求行、请求头、空行和请求数据 这几部分组成
请求行 有请求方法、url和http协议版本字段 3个组成
HTTP协议请求方法有 get、post、head、put、delete、options、trace、connect
请求头 由 关键字/值对组成,每行一对, 关键字和值用英文冒号":"分隔, 请求头部通知服务器有关于客户端请求的信息
空行 最后一个请求头之后是一个空行, 发送回车符和换行符, 通知服务器一下不在有请求头
请求数据不在 get 方法中使用, 而是在 post 方法中使用, post 方法适用于需要客户填写表单的场合, 与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length
响应报文
http 响应也由三部分组成, 分别是: 状态行, 消息报头,响应正文.
状态行: HTTP/1.1(响应采用的协议和版本号) 200(状态码) OK (描述信息)
消息报头: 有 关键字/值对组成, 每行一对, 关键字和值 用英文的冒号 ' : ' 分隔
响应正文: HTML页面
什么是Node.js
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境
Node.js 使用了一个 事件驱动、非阻塞是 I/0 的模型, 使其轻量有高效
Node.js 可以让JavaScript运行在 服务器端上, 它让JavaScript伸到了服务器, 可以跟 PHP、JSP,、Python、Ruby等语言平等
Node不同之处
PHP、Python、Ruby等是独立语言, 二Node.js 用 JavaScript 运行在 v8引擎上
高性能
Node.js特性一 单线程
在传统的服务器语言中, 用户请求一个服务器就会被分配到一个可用的线程中, 而每创建一个线程是需要消耗2M的内存, 如果要让城乡之处更多的用户,则加重了服务器成本(8G内存的服务器, 理论上能容纳 4000左右的并发量)
Node.js不是用多个线程为每个请求执行工作的,相反而是它把所有工作添加到一个事件队列中,然后有一个单独线程,来循环提取队列中的事件,事件循环线程抓取事件队列中最上面的条目,执行它,然后抓取下一个条目当执行长期运行或有阻塞10的代码时,注意这里:它不会被阻塞,会继续提取下一个事件,而对于被阻塞的事件Node.js会从线程池中取出一个线程来运行这个被阻塞的代码,同时把当前事件本身和它的回调事件一同添加到事件队列
特点二 非阻塞 I/0
程序执行过程中必然要进行很多I/0操作,读写文件、输入输出、请求响应等等。I/0操作时最费时的,至少相对于代码来说,在传统的编程模式中,举个例子,你要读一个文件,整个线程都暂停下来,等待文件读完后继续执行。换言之,170操作阻塞了代码的执行,极大地降低了程序的效率
Node .js采用非阻塞型/O机制,非阻塞/0是程序执行过程中,/0操作不会阻塞程序的执行,也就是在1/0操作的同时,继续执行其他代码(这得益于Node的事件循环机制),在1/0设备效率还远远低于CPU效率的时代,这种I/O模型(非阻塞1/0)为程序带来的性能上的提高是非常可观的
特点三: 事件驱动
Node通过事件驱动的方式处理请求是无需为每一个请求创建额外的线程, 在事件驱动的模型当中, 每一个I/O 工作呗添加到事件队列中, 线程循环的处理队列上的工作任务, 当执行过程中遇到堵塞(读取文件、查询数据库)时, 线程不会停下来等待结果, 而是留下一个处理结果的回调函数, 转而继续执行队列中的下一个任务,这个传递到队列中的回调函数在堵塞任务运行结束后才被线程调用
V8引擎是一个非堵塞事件驱动I/O框架, Node基于V8引擎强力驱动. 而这个的底层代码近半都是用于事件队列
查看NodeJS版本 node -v
简单小案例:
/* 使用node开发就是借助包来开发, 所以第一步导入包 */ /* require: 表示导入一个包, 参数表示包的名称*/ var http = require('http'); /* 使用http创建服务器 createServer 有一个回调参数*/ /* 回调中有两个参数 第一个 req: 必须的(required); 第二个res: 响应(response) */ var server = http.createServer(function (req, res) { /* 只要有请求,就会有回调*/ /** 当请求完毕后, 返回给客户端对应的数据 */ res.end('hello word') }) /** 监听服务器 * 第一个参数表示端口, 第二个参数表示服务器的ip地址 * 端口号可以是任何, 但是一般前面2000是属于系统使用的, 所以我们可以使用2000以后的 */ server.listen(3000, '127.0.0.1') /** 运行 * ①在终端运行 node +文件名 * ②在网页直接输入 上边的地址还有端口号 */
设置响应
res.writeHead()
NODEJS