浏览器像Chrome不允许直接调用本地的JavaScript程序,所以只能把程序从服务器下载到本地,然后在本地运行javascript程序。
首先是我们自己开发的一个javascript程序,输出给V8引擎,主要对javascript进行一些解析工作,解析完了之后生成一个二进制代码
,
再加上nodejs本身自己的一些API,解析后的二进制去调用Nodejs的API,调用之后,nodejs还会调用一个叫的事件处理库,它的工作原理就是
一直死循环等待事件处理,当有请求过来时,首先会插入到事件队列,事件循环就不断的从队列中去拿一个个事件,拿到之后去做相应的处理,重点是它有一个V8引擎,可以将Javascript解析成一个二进制的程序,最终调用Nodejs本身的API,然后在做后面的事件处理。
下面我们看JavaScript是怎么解析的,首先V8引擎会受到一个Javascript的源程序,我们在服务端要写一个服务的话,首先是写一个JavaScript的一个小的脚本,给到V8后通过解析得到一个抽象的语法树,最终交给解析器
解析成
,当然也有可能通过编译优化形成优化后的代码
,然后转换成bycode。
下面我们看nodejs的事件处理流程,如上图所示,首先有很多请求到nodejs应用上来,nodejs拿到这个请求之后会生成一系列事件插到事件队列中去,libevent同时启动着一个事件循环不停的从事件队列中取出一个个事件去做相应的事件处理,这种处理有可能非常简单,直接就callback回去了,这时候直接返回一个
,比如我们只是请求一个html页面,非常简单。还有一种就是非常复杂,可能要调用数据库,做查询工作,做一些数据统计,最终展示这个页面,这个时候它会从线程池取一个线程,执行固定的function,然后callback,也可能这个结果只是一个中间结果,它会再插到这个时间处理队列中去,也可能是中间的结果,直接就返回了。当然这个线程用完了还要回收,直接返回给线程池。
如上图所示,实际上在Nodejs里有一个V8引擎,而在JavaScript里也有一个V8引擎,当我们发送一个Http请求到nodejs的时候,实际在请求之前nodejs这个服务要运行起来,首先要有自己的一个服务端的JavaScript,经过V8解析将整个web服务运行起来了,通过调用中间的将整个服务运行起来。这个时候客户端发送一个请求过来说要请求某个东西,nodejs通过libuv解析后去到磁盘上拿到JavaScript文件返回给浏览器, 浏览器拿到JavaScript后交个自己的V8,进行解析,然后再做后面的中间操作。
3.2 nodejs环境搭建
3.3 最简单的http服务
3.4 创建https服务
首先客户端要想服务端发送一个握手,服务端收到请求之后下发证书给客户端,客户端与服务端之间交换秘钥,协商加密的算法,对于客户端来说需要得到服务端的公钥,服务端需要有私钥将客户端加密的内容进行解密,加密完成后,我们就可以进行数据的传输了。
目录如下:
- server.js
'use strict'
//引入https模块
var https = require('https');
//引入文件系统,主要作用是读取证书
var fs = require('fs');
var options = {
//证书的key
key : fs.readFileSync('./cert/2498161_andy-upp.top.key'),
//证书
cert : fs.readFileSync('./cert/2498161_andy-upp.top.pem')
}
//通过https模块创建服务,server里面是一个匿名的回调函数,有两个参数,一个是用户请求,另一个是服务响应
//第一个参数是options,就是我们的这个证书
var app = https.createServer(options, function(req, res){
//返回头,200表示响应成功,内容是一个文本
res.writeHead(200, {'Content-Type': 'text/plain'});
//响应结束,返回一个字符串
res.end('HTTPS:Hello World!\n');
//打开侦听,侦听443端口,IP地址 0.0.0.0 表示侦听所有网卡的8080端口都提供服务
}).listen(443, '0.0.0.0');
服务端执行
node server.js
查看端口占用情况
netstat -ntpl|grep 443
通过浏览区访问
3.5 完成一个真正的web服务器
express其实是nodejs里面专门处理node服务的,serve-index模块可以将一个整个目录发布出来
下面我们新建一个web_server 机支持http服务又支持https服务
安装需要的两个库
npm install express serve-index
server.js
'use strict'
var http = require('http');
var https = require('https');
var fs = require('fs');
var express = require('express');
var serveIndex = require('serve-index');
//实例化express模块
var app = express();
app.use(serveIndex('./public'));
//发布指定的静态目录作为发布路径
app.use(express.static('./public'));
//http server 监听80端口
var http_server = http.createServer(app);
http_server.listen(80, '0.0.0.0');
var options = {
key : fs.readFileSync('./cert/2498161_andy-upp.top.key'),
cert: fs.readFileSync('./cert/2498161_andy-upp.top.pem')
}
//https server
var https_server = https.createServer(options, app);
https_server.listen(443, '0.0.0.0');
访问: