怎么实现一个网站的WebServer(下)
怎么实现一个网站的WebServeWeb服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),例如送回一个HTML页面。
定时器Timer
如果一个请求在建立连接后迟迟没有发送数据,或者对方突然断电,应该如何处理我们需要实现定时器来处理超时的请求。Vino定时器的实现参考了Nginx的设计,Nginx使用一颗红黑树来存储各个定时事件,每次事件循环时从红黑树中不断找出最小(早)的事件,如果超时则触发超时处理。为了简化实现,在Vino中,我实现了一个小顶堆来存储定时事件,如果被处理的定时事件同时支持长连接,那么在该请求处理完毕后会更新该请求对应的定时器,也就是重新计时。定时器相关代码见vn_event_timerh和vn_event_timerc。
HTTPParser
由于网络的不确定性,我们并不能保证一次就能读取所有的请求数据。因此,对于每一个请求,我们都会开辟一段缓冲区用于保存已经读取到的数据。同时,我们需要同时对读取到的数据进行解析,以保证读取到的数据都是合理的数据,例如,假设目前缓冲区内的数据为GET/indexhtmlHTT,那么下一次读取到的字符必须为P,否则,应立即检测出当前请求是一个异常的请求,并主动关闭当前的连接。
基于以上分析,我们需要实现一个HTTP状态机(Parser)来维持当前的解析状态,Vino状态机的实现参考了Nginx的设计,并对Nginx的实现做了简化。HTTPParser相关代码见vn_http_parseh和vn_http_parsec。
MemoryPool
我们一般使用malloc/calloc/free来分配/释放内存,但是这些函数对于一些需要长时间运行的程序来说会有一些弊端。频繁使用这些函数分配和释放内存,会导致内存碎片,不容易让系统直接回收内存。典型的例子就是大并发频繁分配和回收内存,会导致进程的内存产生碎片,并且不会立马被系统回收。
使用内存池分配内存,可以在一定程度上提升内存分配的效率,不需要每次都调用malloc/calloc函数。同时,使用内存池使得内存管理更加简单。在Vino中,针对每一个请求,Vino都会为其分配一或多个内存池(各个内存池形成一个单链表),在请求处理完毕后,一并释放所有的内存。
Vino内存池的实现依旧参考了Nginx的实现,并做了简化,MemoryPool相关代码见vn_palloch和vn_pallocc。
其他
在开发Vino的过程中,还有许多需要考虑和权衡的地方。响应请求时,如果用户请求的是一个很大的文件,导致写缓冲区满,我们如何更好的设计响应缓冲区如何更高效的设计底层数据结构(如字符串、链表、小顶堆等)如何更优雅的解析命令行参数如何对特定信号进行处理如何更健壮的处理错误信息当代码的数量达到一定程度后,如何更快的定位异常代码
Vino的开发&重构暂时告一段落,源码放在了GitHub上。当然,Vino还有许多不足之处,以及未实现的特性。
仅支持HTTPGET方法,暂不支持其他HTTPmethod。
暂不支持动态请求的处理。
支持的HTTP/11特性有限。
以上就是小编对于怎么实现一个网站的WebServe的全部解答。
网站一个网站你是做JAVA的WEB应用吧
那么需要安装WEB服务器
接着用开发工具新建WEB工程,就可以在里面编写JAVA类和连接数据库的方法,也可以在里面浏览数据库信息,编写SQL语句什么的
把工程文件打包放进WEB服务器里面就可以执行了
web页面开发语言有很多种,本文将介绍其中5种常见的语言,分别是html、XML、ASP、JavaScript、VBScript。
0条评论