WebRTC | Web服务器原理、Nodejs工作原理、Nodejs事件处理流程、V8引擎等要点解析
时间:2022-07-23
本文章向大家介绍WebRTC | Web服务器原理、Nodejs工作原理、Nodejs事件处理流程、V8引擎等要点解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 出于安全原因,像Chrome之类的浏览器是不允许直接调用本地的JS文件的; 所以只能把它放在Web服务器端, 通过Web服务器下载到本地,再运行这些程序;
- 后续很多WebRTC案例,包括信令服务器,都是需要使用到Web服务器的;
Web服务器选型
- Nodejs 比较特殊,可以用js开发服务端程序; 有两份JS, 一份是用于控制服务器的, 一份是用于下载到客户端去运行的;
- Nginx 性能上比Apache更好,灵活度等也优于Apache, 所以逐渐把Apache取代;
- Apache 一开始出现的时候占服务器市场80%, 逐渐被Nginx取代;
Web服务工作原理
Nodejs工作原理
- Application: 我们自己开发的JavaScript程序, Application运行,首先输出给V8JS引擎;
- V8 JavaScript Engine【V8JS引擎 | 重点】 这个引擎是从Chrome项目中抽取出来的; 主要是对JS进行一些解析工作,解析完了之后生成二进制代码; 解析生成的二进制代码去调用 Nodejs的API【NODE.JS BINDINGS】, 随后【NODE.JS BINDINGS】会调用LIBUV【一个事件处理库】
- 【LIBUV】 类似于Android的Handler消息机制;
JS解析过程
- 首先
V8引擎
会收到 JS源程序;
- 在服务端写服务的时候, 首先是用JS写一个小的脚本;
- 脚本经过V8, 通过parser,解析成Abstract Syntax Tree, 最终交给解析器【interpreter】, 【interpreter】将其解析成bytecode【字节码,执行代码】; 也可能【interpreter】经过编译优化【optimizing compiler】, 形成优化后的代码【optimized code】, 最终再转化成bytecode;
Nodejs事件处理流程
- Nodejs收到事件之后的大概的处理流程
- 首先是若干个Request, 请求到Node.js 应用上来;
- 拿到请求之后,会生成请求对应的事件, 插入到事件队列【LIBUV中 的 Event Queue】中去, 【LIBUV】中的Event Loop会不断循环, 读取【Event Queue】队头的事件进行处理;
- 简单的事件则直接【Callback】,返回一个【Response】 (如请求一个HTML简单页面的事件);
- 还有复杂一点的事件, 可能需要调用数据库、做一些查询工作、做数据统计, 最终展示页面, 这个时候会从线程池【Thread Pool】取出一个线程【Thread】, 执行对应的【Function】,最后【Callback】,返回一个【Response】; 最后回收线程;
- 以上两个步骤的【Callback】, 如果是最终结果,自然是直接返回一个【Response】, 如果只是中间结果, 可能还需要再次生成事件,插入【Event Queue】, 进行下一轮的事件处理;
两个V8引擎
- 我们说Nodejs比较特殊, 可以用js开发服务端程序; 有两份JS, 一份是用于控制服务器的, 一份是用于下载到客户端去运行的;
- 那么 服务端、客户端 其实分别对应着一个V8引擎;
- 一般情况下,在客户端发送请求之前,
Nodejs
的服务
是要先运行
起来的【running】, 服务端有自己的JS, 经过(服务端 的)V8
解析、中间层LIBUV
处理, 然后先运行起来了; -
客户端
发送一个http请求
到Nodejs
服务端, 比如要请求【Request】某一个JS文件, 那【Request】生成对应的事件【Event】之后, 经过LIBUV
的事件处理机制
【上述流程】, 进行事件处理,操作磁盘,拿到对应JS文件, 然后Callback、Response返回给客户端【浏览器】; - 浏览器【客户端】收到
服务端
的JS文件
之后, 也将JS代码
交给【(浏览器/客户端
自己的)V8
】进行解析
; 解析得到执行代码【byteCode】
之后; 随后进行JS逻辑
对应的中间层、底层
操作;
- 远程RPC溢出EXP编写实战之MS06-040
- 浮点数加法引发的问题:浮点数的二进制表示
- 新手科普 | MySQL手工注入之基本注入流程
- linux 系统监控、诊断工具之 lsof 用法简介
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
- 关于 WEB/HTTP 调试利器 Fiddler 的一些技巧分享
- Java线程使用技巧学习(一)
- Python FAQ(常见问题解答)(1)
- ElastAlert监控日志告警Web攻击行为
- Java线程使用技巧学习(二)
- 挖洞经验 | 看我如何发现“小火车托马斯”智能玩具APP聊天应用漏洞
- Hive 常见问题与技巧【Updating】
- Hive 基础(1):分区、桶、Sort Merge Bucket Join
- 简化你的 java 字符串操作:Guava 之 CharMatcher 用法简介
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Shiny-R语言轻松开发交互式web应用
- SPSS中的等级线性模型Multilevel linear models研究整容手术数据
- Python花式表白
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- WordPress运行内存不足的解决方式
- ggplot2 |legend参数设置,图形精雕细琢
- miRBase物种名缩写
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- 在R语言中使用航空公司复杂网络对疫情进行建模
- R语言用关联规则和聚类模型挖掘处方数据探索药物配伍中的规律
- ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
- ggalluvial|炫酷桑基图(Sankey),你也可以秀
- R|批量循环处理同一格式文件-csv,txt,excel
- 误差线怎么画,写不写代码as you like
- Nomogram(诺莫图) | Logistic、Cox生存分析结果可视化