基于Reactor的Web服务器

Posted TangguTae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Reactor的Web服务器相关的知识,希望对你有一定的参考价值。

之前学完网络编程以后,想自己动手实现一个Web服务器,在这方面可以多看看别人写的代码、一些书籍(Linux-Unix系统级编程手册)等等的方式来学习一下怎么实现一个简单的服务器。

项目整体框架

项目介绍:利用Reactor模式搭建一个Web服务器。主要功能是对HTTP请求进行分析,并对所请求的资源构建相应的响应。利用线程池和I/O多路复用技术epoll实现一定的并发量。并设计CGI接口,可以在此基础上自由扩展应用层服务。

具体的工作流程:将事件的发生(IO请求)与事件的处理(连接的到来、数据的读取与发送和数据的解析与合成)进行解耦。每个接收到的新的socket会生成自己的事件,并注册自己的回调函数。此时交给epoll去监听这些套接字上面所对应的事件是否被触发。一旦被触发,事件分派器就会根据注册的回调函数去执行各自的处理逻辑,具体来说,在这个项目中回调函数的功能是构建任务,交付给线程池去执行。

HTTP解析与响应的构建的具体过程

除了大的项目的框架的搭建以外,作为一个Web服务器,对HTTP请求与解析是其中的关键一环。与上面的analysis所对应。

处理的具体过程如下:

根据HTTP协议可知

对HTTP请求进行解析,主要是请求行、请求报头和请求正文的解析。根据是GET方法和POST方法可以区分是否带有请求正文。GET方法如果携带信息在请求行中的URL参数中。这两种情况需要交给CGI处理,其他的情况正常的构建响应。响应的构成也是按照HTTP协议,构建响应行、响应报头、空行和响应响应正文。这里要根据整个HTTP请求分析的结果来构建响应,出现任何错误的请求要返回对应的错误页面和错误码,除此之外返回正常HTTP所请求的资源即可。

项目源码:https://gitee.com/zhangy9899/web-server.git

在这个项目中需要知道socket编程、系统级IO、多线程、多路复用IO等等技术。网络编程套接字、系统IO在之前的博客有讲解过。

Linux操作系统 - 网络编程socket(2)_TangguTae的博客-CSDN博客

Linux操作系统-系统级IO_TangguTae的博客-CSDN博客

Linux操作系统-进程控制_TangguTae的博客-CSDN博客_linux系统的进程控制

接下来将对项目中其他的关键技术例如多路复用IO中的epoll和线程池等做技术总结。

未完待续......

以上是关于基于Reactor的Web服务器的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin结合Spring WebFlux实现响应式编程

C++服务器设计:基于I/O复用的Reactor模式

Unix/Linux 编程:网络编程之 基于Reactor实现WebSocket服务

C++服务器设计:基于I/O复用的Reactor模式

Reactor模式总结

从另一个角度看Reactor