1 web服务器
浏览器像Chrome不允许直接调用本地的JavaScript程序,所以只能把程序从服务器下载到本地,然后在本地运行javascript程序。
首先APPLICATION是我们自己开发的一个javascript程序,输出给V8引擎,主要对javascript进行一些解析工作,解析完了之后生成一个二进制代码,再加上nodejs本身自己的一些API,解析后的二进制去调用Nodejs的API,调用之后,nodejs还会调用一个叫LIBUV的事件处理库,它的工作原理就是一直死循环等待事件处理,当有请求过来时,首先会插入到事件队列EVEENTQUEUE,事件循环就不断的从队列中去拿一个个事件,拿到之后去做相应的处理,重点是它有一个V8引擎,可以将Javascript解析成一个二进制的程序,最终调用Nodejs本身的API,然后在做后面的事件处理。
下面我们看JavaScript是怎么解析的,首先V8引擎会收到到一个Javascript的源程序,我们在服务端要写一个服务的话,首先是写一个JavaScript的一个小的脚本,给到V8后通过解析得到一个抽象的语法树Abstract Syntax Tree,最终交给解析器interpreter解析成bytecode,当然也有可能通过编译优化形成优化后的代optimizing complier,然后转换成bycode。
下面我们看nodejs的事件处理流程,如上图所示,首先有很多请求R到nodejs应用上来,nodejs拿到这个请求之后会生成一系列事件插到事件队列中去,libevent同时启动着一个事件循环不停的从事件队列中取出一个个事件去做相应的事件处理,这种处理有可能非常简单,直接就callback回去了,这时候直接返回一个Response,比如我们只是请求一个html页面,非常简单。还有一种就是非常复杂,可能要调用数据库,做查询工作,做一些数据统计,最终展示这个页面,这个时候它会从线程池取一个线程,执行固定的function,然后callback,也可能这个结果只是一个中间结果,它会再插到这个时间处理队列中去,也可能是中间的结果,直接就返回了。当然这个线程用完了还要回收,直接返回给线程池。
如上图所示,实际上在Nodejs里有一个V8引擎,而在JavaScript里也有一个V8引擎,当我们发送一个Http请求到nodejs的时候,实际在请求之前nodejs这个服务要运行起来,首先要有自己的一个服务端的JavaScript,经过V8解析将整个web服务运行起来了,通过调用中间的中间层libuv将整个服务运行起来。这个时候客户端发送一个请求过来说要请求某个东西,nodejs通过libuv解析后去到磁盘上拿到JavaScript文件返回给浏览器, 浏览器拿到JavaScript后交个自己的V8,进行解析,然后再做后面的中间操作。
2 nodejs环境搭建
2.1 http服务
http://nodejs.cn/learn/the-nodejs-http-module#httpcreateserver
'use strict'
var http = require('http');
var app = http.createServer(function(req, res){
//设置响应头 Content-Type
res.setHeader('Content-Type', 'text/palin; charset=utf-8');
//'Content-Type': 内容类型
//text/palin: 普通文本
//text/html: html
//charset=utf-8: 编码格式https://blog.csdn.net/weixin_41374628/article/details/89400908?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
res.end('你好\n');
}).listen(8080, '0.0.0.0');
命令行执行: node server.js
window 执行 netstat -ano
浏览器打开 localhost:8080
2.2 创建https服务
如何建域名和服务器,我用的是腾讯云。买了一个域名租了一个服务器。
浏览器调用音频设备和视频设备时涉及用户的隐私,chrome不允许http 打开摄像头
首先客户端要想服务端发送一个握手,服务端收到请求之后下发证书给客户端,客户端与服务端之间交换秘钥,协商加密的算法,对于客户端来说需要得到服务端的公钥,服务端需要有私钥将客户端加密的内容进行解密,加密完成后,我们就可以进行数据的传输了。
目录如下:
- server.js
'use strict'
var https = require('https');
var fs = require('fs');
var options = {
key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'),
cert : fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem')
}
var app = https.createServer(options, function(req, res){
//设置响应头 Content-Type
res.setHeader('Content-Type', 'text/palin; charset=utf-8');
//'Content-Type': 内容类型
//text/palin: 普通文本
//text/html: html
//charset=utf-8: 编码格式https://blog.csdn.net/weixin_41374628/article/details/89400908?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
res.end('你好\n');
}).listen(443, '0.0.0.0');
注意:腾讯云域名下载的证书中没有.pem,可以将你下载的证书中:
的内容复制到这两个文件中即可!
服务端执行
node server.js
查看端口占用情况
通过浏览器访问
2.3完成一个真正的web服务器
express其实是nodejs里面专门处理node服务的
serve-index模块可以将一个整个目录发布出来
下面我们新建一个web_server 机支持http服务又支持https服务
安装需要的两个库
npm install express serve-index
'use strict'
var http = require('http');
var https = require('https');
var fs = require('fs');
var serveIndex = require('serve-index');
var express = require('express');
var app = express();
//发布静态目录public 顺序不能换
app.use(serveIndex('./public'));
app.use(express.static('./public'));
//JSON格式,key CERT
var options = {
key : fs.readFileSync('./cert/1557605_www.learningrtc.cn.key'),
cert : fs.readFileSync('./cert/1557605_www.learningrtc.cn.pem')
}
//将所有的请求回调给app即EXPRESS 由express处理
var https_server = https.createServer(options, app);
https_server.listen(443, '0.0.0.0');
var http_server = http.createServer(app);
http_server.listen(80, '0.0.0.0');
访问: