简易阅读器

我们先了解一下这个项目最终达到的一个目标,然后以这个来进行项目分析

  1. 实现基本的HTTP/1.0版本的web服务器,客户端能够使用GET,POST方法请求资源
  2. 服务器将客户端请求的资源以html/js/pdf页面呈现,并能够进行差错处理(如:客户端请求的资源不存在时,服务器能够返回一个404页面)
  3. 服务器能够运行简单的cgi,比如客户端在表单中输入数据,服务器就能够将运行结果返回给客户
  4. 能够通过页面对数据库进行操作,如增删改查等操作

一.http服务器实现的基本框架

  • 关于HTTP协议                                                                                                                                                                                即超文本传输协议,是互联网上应用最广泛的网络协议。它是应用层协议,底层是基于TCP通信的。HTTP协议的工作过程:客户端通过浏览器向服务器发送文档请求,浏览器将请求的资源回应给浏览器,然后关闭连接。即:连接->请求->响应->关闭响应
  • 关于URL                                                                                                                                                                                          即统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性,它包含的信息指出文件的位置以及浏览器应该怎么处理它。一个完整的URL包括协议类型,主机类型,路径和文件名,http协议的URL格式:http://host[:post]  [abs_path],http表示使用http协议来进行资源定位;host是主机域名;port是端口号。一般有默认的,abs_path代表资源的路径                                                                                                                                                                                                   这里我主要介绍项目中涉及的URL的两种格式--URL带参数和不带参数的                                                                                        GET方法使用的是带参数的URL,即传递的参数会使用?连接在资源路径的后边;POST方法使用的是不带参数的URL,它的  参数是    简易阅读器_第1张图片

       GET方法使用的是带参数的URL,即传递的参数会使用?连接在资源路径的后边;POST方法使用的是不带参数的URL,它的参数是   通过http请求报头中的请求消息传递给服务器的

  • 关于http的请求与响应格式

         简易阅读器_第2张图片              简易阅读器_第3张图片          响应报头中的状态码和状态码描述,例如:当请求的资源不存在时,会收到“404 not found”的页面,404就是状态码,“not found”就是状态码描述,即请求的文件不存在

二.服务器实现的基本思路

  1. http协议是基于TCP通信的协议,因此,实现web服务器的第一步至少能在两个主机不同进程间的TCP通信
  2. 接下来的部分就是比较主要的处理逻辑了,因此,当服务器收到请求后,首先应该分析请求方法(因为web服务器是要支持cgi的,但请求方法不同处理cgi也不同,这里我们只处理GET和POST方法)
  3. 当方法确定后,应该拿到请求的URL,这一步是为了我们后面能处理GET和POST方法的cgi(GET和POST的参数位置不同,GET的参数在URL中,POST的参数在请求正文中)
  4. 判断资源是否存在,如果存在,判断这个资源是是一个目录,普通文件,还是一个可执行程序,之前几步我们已经提取到URL以及参数。GET方法:如果没有参数。就将请求资源直接返回(即进入非cgi模式运行);否则,就进入cgi模式内部运行;只要是POST方法就需要支持cgi;直接进入cgi函数内部运行

非cgi模式:                                                                                                                                                                                         进入非cgi模式时一定是GET方法且没有参数,此时进入echo_www()函数内部即可,该函数会将所请求的资源以html的格式返回给浏览器                                                                                                                                                                                          

cgi模式:

简易阅读器_第4张图片

上述这张图描述了运行cgi时的过程,首先服务器要从浏览器上获取参数,然后需要fork出一个子进程进行cgi部分的处理,父进程通过环境变量的方式将参数转交给子进程,子进程运行完成后,将结果交给父进程,父进程在将数据输出给浏览器,在这个过程中,可以将父进程看做是一个所谓的中间量,只进行了参数的转交,因此可以将子进程的输入输出文件描述符进行重定向,即子进程直接与浏览器联系

下面总结出父子进程内部各自需要干的事情

简易阅读器_第5张图片

三.错误处理

错误处理这部分的实现可以参考echo_www()函数,但需要改变响应的消息报头的格式,即改变状态码,状态码描述,以及返回的页面,例如当请求的资源不存在时,服务器需要返回给浏览器一个默认的404页面。告诉客户端请求的资源不存在。效果如图

简易阅读器_第6张图片

四.项目文件

简易阅读器_第7张图片

目录:

build.sh :自动生成output发布版

httpd.c:服务器方法实现

lib:MySQL需要的部分库

sql_connect:数据库的连接以及数据库部分的cgi

wwwroot:web服务器的根目录,包含各种资源页面(例如默认的index.html页面,差错处理的404页面)

五.实现结果

请求资源存在

简易阅读器_第8张图片

点击进行阅读

 

简易阅读器_第9张图片

点击在线阅读

 

简易阅读器_第10张图片

可进行下载

 

简易阅读器_第11张图片

提交评论

 

简易阅读器_第12张图片

查看评论

 

简易阅读器_第13张图片

六.项目测试

1.用Webbench进行压力测试

简易阅读器_第14张图片

-t表示运行测试的时间,如果不指定,默认为30秒,c表示客户端数量,也就是并发数

结果分析:

Pages/min:指的输出页数/分

bytes/sec:是指比特/秒

这两个指标能反映网站的访问速度。succeed和failed表示请求的成功数目

2.用selenium编写测试化脚本

#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Chrome()
first_url= 'http://192.168.43.149:9999/'
print "now access %s" %(first_url)
driver.get(first_url)
driver.find_element_by_name("name").clear()
driver.find_element_by_name("name").send_keys("wangyue")
driver.find_element_by_name("content").clear()
driver.find_element_by_name("content").send_keys("very good")
time.sleep(2)
driver.find_element_by_css_selector("input[type=\"submit\"]").submit()
time.sleep(2)
driver.back()
driver.find_element_by_xpath("/html/body/div[1]/div[2]/a/h3").click()
time.sleep(3)
driver.back()
time.sleep(3)
three_url= 'http://192.168.43.149:9999/library/2.pdf'
driver.get(three_url)
#driver.switch_to_window("Top Window")
#driver.find_element_by_xpath("//a[contains(text(),'在线阅读')])[2]").click()
#driver.find_element_by_link_text(U"在线阅读").click()
time.sleep(15)
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(10)
driver.quit()

 

你可能感兴趣的:(简易阅读器)