基于C++的web服务器---总述篇

一个web服务器的项目,这里把自己的理解写出来,同时也是想记录一下整个学习的过程。
废话不多说,直接开始。
什么是web服务器?
就是通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收,存储,处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个Error信息。

用户如何与你的Web服务器进行通信?
在浏览器中键入“域名”或“IP地址:端口号”,浏览器则先将你的域名解析成相应的IP地址或者直接根据你的IP地址向对应的Web服务器发送一个HTTP请求。这一过程首先要通过TCP协议的三次握手建立与目标Web服务器的连接,然后HTTP协议生成针对目标Web服务器的HTTP请求报文,通过TCP、IP等协议发送到目标Web服务器上。

上面大家大概也了解到了什么是服务器以及大概的通信过程了,接下来直接开始整我们这个项目:

一.做一个web服务器我们要准备些什么?
我们采用C++的话,肯定要充分使用它类的特性,那么我们可以想一想到底要封装多少个类呢?

首先,http连接肯定是一个,这个类主要负责服务器与客户端的通信;
其次,可以看到,我们封装了一个的类,这个主要原因是,后面都需要用到,所以我们封装起来便于调用就好;

然后,我们封装了一个线程池的类,那么为什么要封装这个类呢,就用普通的线程操作不行吗?确实不可以,如果只有几个连接请求的话,当然没问题,但如果请求数很多,那就会出现大问题了,当待线程处理的事件阻塞在请求队列上时,我们为了效率,肯定要采用线程并发的方式,如果只是一个一个去读,那太慢了,但并发也会产生一个问题,我们不断去创建线程去处理,然后销毁,又去创建…这个开销是非常大的,而线程池完美解决了这个问题,他会事先申请一堆线程放在池中(具体怎么做后面再说),然后线程处理完任务后会自动释放资源然后回到池中继续阻塞,这样就不用再去创建,销毁,节省了大量开销。

好,接下来我们还需要一个定时器,为什么要定时器呢? 想象一个场景,很多的请求都被连接上了,比如有10000个,但是他们中事实上只有3个连接发来了读请求,其他的事件事实上是在空占资源,但是什么都没做,可以想象,这将会消耗多大的资源。

然后就是数据库连接了,一个服务器怎么能没有数据库的部分呢?我们肯定是要维护一个数据库,至少登录注册校验是需要的。
其实到了这里,一个服务器的模型已经出来了,接下来我们还可以给它添砖加瓦,比如,加上日志系统等…
那我们现在先把这个方面先配置好。

二.web服务器到底是怎么工作的?
从第一点我们可以知道,一个web服务器至少需要http连接,线程池,数据库以及定时器。
那我们先了解一下他到底是怎么工作的:

首先,比如你输入一个url,这代表你向服务器发出了请求,那么就要实现tcp的三次握手,怎么实现三次握手呢?我们这里采用socket套接字来实现,那么又如何实现套接字呢?有select,poll,epoll的方法,这几种的区别大家有时间可以查查,这里不细说(当然后面讲到对应的部分我会再说),我们这里采用epoll来实现。epoll的具体实现呢也以后再说,比较复杂,这里只需要知道经过epoll操作后我们可以将发出的报文请求(例如get/post)封装成一个请求对象放在线程池的工作队列上。

其次,报文已经被封装成请求对象并挂在请求队列上了,那么如何处理他呢?这里就要用到线程池了。请求对象挂到请求队列,会唤醒正在沉睡的线程,线程池里的线程由阻塞态变成了就绪态,然后去拿请求队列上的请求对象来操作(这里注意线程对这个队列的操作是一定要互斥的,不能出现同时两个线程对一个事件操作的情况,这个想必大家都懂),具体的操作就是解析报文,数据库这个时候就起作用了,用来检验用户信息(比如用户名,密码这种)…

**最后,**解析完成后,需要将响应报文发回去,因此要写入状态行,响应头呀这些信息,然后触发写事件,通过epoll将响应报文发给客户端。

三.具体实现
由于这个项目整个的代码其实挺复杂,如果要在一篇里面讲清楚其实是不太现实的,而且我最近也比较忙,因此我打算按一天一篇的速度来更新没具体的更新步骤就是按划分的类来更新吧:
一.锁的实现类
二.http连接类
三.线程池类
四.定时器类
五.数据库类
这里可能会根据每一个类的具体实现难度来确定用几篇来讲,就比如http连接类,光一篇肯定是不好讲清楚的,那匆匆写完一篇其实也并有什么用,因此可能会用两篇到三篇来仔细讲一下。

再就是代码的问题,我想的其实是先能把这份代码的每个流程先讲清楚,所以不太想直接把代码摆出来,事实上这并没有什么意义,因此我准备项目更新完了之后把代码链接发出来。

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值