服务器是干什么的,服务器的分类及作用
程序员文章站
2023-11-29 10:19:22
在直播中,创建房间,获取房间,都需要服务器,因此需要搭建web服务器web服务器能处理http请求的服务器都可以叫web服务器node.js介绍node.js什么时候出现,2009年,ryan dah...
在直播中,创建房间,获取房间,都需要服务器,因此需要搭建web服务器
web服务器
- 能处理http请求的服务器都可以叫web服务器
node.js介绍
- node.js什么时候出现,2009年,ryan dahl(瑞恩·达尔)在github上发布了最初版本的部分node.js包,随后几个月里,有人开始使用node.js开发应用
- 什么是node.js,做过javascript开发的,看到node.js这个名字,初学者可能会误以为这是一个javascript应用,事实上,node.js采用c++语言编写而成,是一个javascript的运行环境,意思就是底层使用c++编写,外层封装采用javascript,需要使用javascript解析执行。
- 比如oc底层也是c++,但是执行代码,只需要解析oc代码。
- node.js是一个后端的javascript运行环境,这意味着你可以编写服务器端的javascript代码,交给node.js来解释执行。
node.js工作原理与优缺点(了解一门语言的开始)
-
传统web服务器原理(t)
:传统的网络服务技术,是每个新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。 -
node.js工作原理(t)
:只运行在一个单线程中,使用非阻塞的异步 i/o 调用,所有连接都由该线程处理,也就是一个新的连接,不会开启新的线程,仅仅一个线程去处理多个请求。 -
优缺点
:- 传统的比较消耗内存,node.js只开启一个线程,大大减少内存消耗。
- 假设是普通的web程序,新接入一个连接会占用 2m 的内存,在有 8gb ram的系统上运行时, 算上线程之间上下文切换的成本,并发连接的最大理论值则为 4000 个。这是在传统 web服务端技术下的处理情况。而 node.js 则达到了约 1m 一个并发连接的拓展级别
- node.js弊端:大量的计算可能会使得 node 的单线程暂时失去反应, 并导致所有的其他客户端的请求一直阻塞, 直到计算结束才恢复正常
- 疑问?node.js是单线程的。单线程怎么开启异步?怎么工作的? 需要了解事件驱动。
- 什么是事件驱动?(t)
- 传统的web server多为基于线程模型。你启动apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了io操作(这也被称之为阻塞式io).想提高这样的web server的性能就只有启动更多的server实例。
- node.js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式io或者事件驱动io)
- 本质:当然最终处理事件还是需要底层开启线程,只不过接受请求只用一个线程去接收。
node.js使用介绍
- node.js使用module模块去划分不同的功能,以简化app开发,module就是库,跟组件化差不多,一个功能一个库。
- nodejs内建了一个http服务器,可以轻而易举的实现一个网站和服务器的组合,不像php那样,在使用php的时候,必须先搭建一个apache之类的http服务器,然后通过http服务器的模块加载cgi调用,才能将php脚本的执行结果呈现给用户
- require() 函数,用于在当前模块中加载和使用其他模块;
express模块(框架)
- express是node.js第三方库
- express可以处理各种http请求
- express是目前最流行的基于node.js的web开发框架,
- express框架建立在node.js内置的http模块上,可以快速地搭建一个web服务器
- express官方文档
- javascript文档.aspx)
请点击此处输入图片描
搭建web服务器步骤
一、安装node.js
- 打开终端,输入node -v,先查看是否已经安装
- 如果没有安装,就需要安装node软件。
- mac上可以使用homebrew,安装node
- homebrew:homebrew简称brew,是mac osx上的软件包管理工具,能在mac中方便的安装软件或者卸载软件,相当于window上360管家,可以帮你下载软件。
- 先输入brew -v,查看mac是否安装了homebrew
- 安装ruby教程(http://www.jianshu.com/p/daa92187621c)
- 使用ruby安装homebrew,前提是安装了ruby
- 输入指令安装brew
使用homebrew安装node,输入指令
- 安装完,输入`node -v“查看是否安装成功二、安装npm
- npm是随同nodejs一起安装的包管理工具,用于下载nodejs第三方库。
- 类似ios开发中cocoapods,用于安装第三方框架
新版的nodejs已经集成了npm,所以只要安装好node.js就好
三、利用npm下载第三方模块(express和socket.io)
- package.json
- package.json类似cocoapods中的podfile文件
- package.json文件描述了下载哪些第三方框架.
- 可以使用npm init创建
- 需要添加dependencies字段,描述添加哪些框架,其他字段随便填
- 注意:不能有中文符号
四、执行npm install,就会自动下载依赖库
五、创建node.js文件,搭建服务器
- 只要文件,以js为后缀就可以了,比如app.js
- 使用node app.js 就能执行文件
- 注意点:监听端口要注意,不能使用已经占用的端口比如(80),每个服务器相当于一个app,都需要端口,才能找到入口
六、简单的搭建http服务器
七、express框架
- 直接创建express应用,就是服务器,可以直接监听
- 需要主动监听请求,get,post
八、路由
- 路由:如何响应客户端的请求
- 添加url路径,根据不同路径,显示不同内容
- 访问地址,/home应该往端口后拼接,8080/home
路由句柄(索引):执行完一个函数,接着执行下一个 ,因为有时候处理一个请求,需要做很多其他事情,写在一起业务逻辑不好分开,所以多弄几个行数
九、中间件
- 优化代码,使代码清晰可读
- 注意点,函数一定要添加next参数,一定要调用next(),才会进行下面操作,代码使一行一行执行,解释性语言
- 原理,发送一个请求给服务器的时候,会被中间件拦截,先由中间件处理,每个中间件都有一个回调函数作为参数
- use是express注册中间件的方法
- 代码演示
十、get请求参数
- request.query会把请求参数包装成字典对象,直接通过点就能获取参数
十一、post请求参数
- 使用http发送请求,需要设置content-type字段
- content-type字段2.1 application/x-www-form-urlencoded(普通请求,默认一般使用这种)2.2 application/json(带有json格式的参数,需要使用这个,比如参数是字典或者数组)2.3 multipart/form-data(传输文件,文件上传使用这个)
- afn框架中afhttprequestserializer使用的是application/x-www-form-urlencoded,afjsonrequestserializer使用的是application/json
- node.js需要使用body-parser模块,解析post请求参数,安装body-parser模块,用命令行
可以采用中间件的方式解析post请求参数
5.1 注意bodyparser.urlencoded参数是一个字典,需要添加`{}“包装,bodyparser.urlencoded({extends:true})
5.2 extends必传参数,是否展开
- 完整代码
十二、express创建对象返回客户端
- {}:字典 []:数组
- 自定义对象,才有function
- function可以定义函数,也可以定义对象,一般有属性的,都是对象
- 定义对象,this:表示当前对象,类似self
- 对象可以直接输出
十三、express模块开发
- 如果把所有代码写在一个文件中,不好维护,代码可读性不好,最好分离文件
- 使用模块开发,exports用来定义模块接口,可以定义函数,也可以定义自定义对象,需要用module.exports
- 注意,module.exports和exports不能重复,重复以module.exports为准
- 路径问题: ./ : 表示当前文件
- main.js
- user.js
十四、字典和数组删除操作
- 删除数组splice,splice有2两个参数,第一个参数,从哪个角标开始 第二个参数,删除几个元素
- 删除字典delete
- 注意:delete删除数组,删除不干净,只是把元素删除,当前角标位置并不会移除
- [1,2,3] 比如delete arr[0] => [,2,3]
十四、直播房间服务器搭建
- 创建package.json,安装express模块
- 设计服务器接口和客户端怎么交互
- 直播房间业务逻辑3.1 主播主动开启房间3.2 通知服务器开启房间了3.3 服务器保存房间3.4 观众打开房间,查看直播3.5 主播关闭直播,通知服务器移除房间号
- 服务器处理4.1 主播开启房间,创建房间,需要传入给服务器保存4.2 服务器用什么保存房间名称,数组还是字典4.3 应该使用字典存储,当主播关闭房间时,可以根据房间号,找到服务器对应的房间号删除。4.4 添加房间,删除房间之后,服务器应该把最新的房间信息返回给客户端展示4.5 服务器可以直接返回房间字典,但是这样客户端必须自己处理下,服务器最好返回房间数组4.6 object.keys(rooms),传入一个字典,就能获取字典中所有keys,返回一个数组4.7 然后遍历keys数组,一个一个取出对应的value,在保存到数组中4.8 可以使用map函数,让数组中所有元素执行一个方法,然后会自动把处理结果包装成数组.4.9 map函数原理,就是遍历数组中元素,一个一个执行,map函数的参数就是一个函数,,这个函数的参数就是数组中的一个元素key,map需要有返回值,返回值就是key参数的处理结果,会自动把处理结果包装到新数组,然后再统一返回处理好的数组
- 客户端处理5.1 房间模型(id,房间名称)5.2 保存到服务器字典,id作为key,房间名称作为value5.3 在发送服务器的时候,需要把id和value传给服务器5.4 搞两个参数(一个roomid,一个roomname)
服务器代码