资源下载地址:https://download.csdn.net/download/sheziqiong/85706486
资源下载地址:https://download.csdn.net/download/sheziqiong/85706486

Web 服务器与测试工具开发

一、系统概述

1.1 系统背景

基于 Java 编程语言,利用 http socket 通信技术,写一个小型的 Web 服务器与一个爬虫的测试工具,来对比分析所写的服务器获取到的页面源码与从 Tomcat 获取的相似度。

1.2 系统目标

序号 目标内容
1 客户端可以通过 GET 和 POST 获取信息
2 支持 HTML、servlet、JSP 页面的访问
3 支持标准的 filter 行为
4 服务器与一个客户端能维持一个会话
5 客户端支持带参数的 POST 获取
6 客户端能够比较获取到的网页结果

1.3 开发环境与工具

序号 类别 具体需求 备注
1 硬件 Windows 10
2 软件 eclipse

二、需求分析

2.1 系统需求概述

小型 Web 服务器:

支持客户端的网页请求,进行并发处理,缩短请求的响应时间。

可响应 GET、POST(HTML、servlet、JSP)页面的请求。

对每次网页请求都进行过滤(filter)。

支持 request、response 的跳转请求。

可维持一个客户端与服务器间的会话(session)。

客户端模拟器:

通过输入端口连接 Web 服务器,完成交互。

支持 get 方法的页面请求。

支持 post 方法,可以对参数进行封装。

构建测试用例:

手工将“Java Web 服务器开发”中的示例部署到 Tomcat 中,执行程序,抓取各个页面的输出,保存成“标准结果”,每个页面一个结果文件。

手工将“Java Web 服务器开发”中的示例部署到自己开发的 Web 服务器中。采用本程序模拟上述访问过程,将“模拟结果”进行保存。

通过“实习 3 中”的文件相似性的方法对于“模拟结果”和“标准结果进行比较”,显示输出的结果。

2.2 功能性需求

可以使用 GET 方法请求网页并得到正确的返回结果

可以使用 POST 方法请求网页并得到正确的返回结果

能够比较 Tomcat 和自己开发的服务器的返回结果的相似度

2.3 非功能性需求

服务器对读取的 WebContent(原老师给的是一个动态网页项目文件夹下的子目录)上升为一个动态网页项目,也就可以读取与 MyWebServer1.0 同级目录下的不同动态网页项目,且获取的 url 格式与 Tomcat 一样,MyWebContent1.0 是一个动态网页项目,all.html 是该项目里面的一个需要获取的页面。

例:http://localhost:8888/MyWebContent1.0/all.html

三、概要设计

3.1 系统总体设计

Web 服务器

总体上可以把 Web 服务器的代码分装成三个包:

Server 包封装服务器的主体流程:(VritualMachine)建立 socket 连接、(ProcessOne)过滤网、(ProcessTwo)发送(转译后)网页文件;

DataPool 包封装所有数据池,来降低类的耦合性,用 synchronized 来保证存取的数据安全:包括 ServletPool、JspPool、SessionPool、FilterPool;

Parameter 包封装了扩展 servlet-api.jar 的接口的所有类:

AFilterChain (implements FilterChain)、

Response(implements HttpServletResponse)、

Request(implements HttpServlet Request)、

Dispatcher(implements RequestDispatcher)、

Session(implements HttpSession);

测试工具

GET 方法,通过 socket 连接之后发送请求,然后接收网页返回的 Response,再去掉 GET 方法返回的头部,然后返回。

POST 方法,POST 通过模拟人登录浏览器获取信息来实现。有两种情况,如果页面中有 servlet 会先获取页面中的 servlet,然后设置 POST 的 header 和 method,并且设置成不马上转发和重定向,紧接着,如果调用函数时没有给表单的参数,则 POST 之后直接获取浏览器的返回结果,如果给了表单的参数,就会发送 POST 之后获取返回的重定向页面,然后设置对应的 GET 头,此时需要设置 JSESSIONID 以保证是同一个用户访问的页面,然后再获取浏览器的返回结果。

3.2 系统功能设计

Web 服务器

HTML:收到 socket 连接时,创一个线程读取 socket 输入流的报文头与体并创建 req 与 resp 对象,找到过滤链并执行过滤操作,最后写入报文头到 socket 输出流,并读取 HTML 文件作为报文体

Servlet:收到 socket 连接时,创一个线程读取 socket 输入流的报文头与体并创建 req 与 resp 对象,找到过滤链并执行过滤操作,到 ServletPool 找 servlet 对象,新生成一个调用服务器请求的方法,生成对应 HTML 文件,最后写入报文头到 socket 输出流,并读取 HTML 文件作为报文体

JSP:收到 socket 连接时,创一个线程读取 socket 输入流的报文头与体并创建 req 与 resp 对象,找到过滤链并执行过滤操作,从 JspPool 获取转译成 servlet 的对象,调用该对象的 GET/POST 方法,生成对应 HTML 文件,最后写入报文头到 socket 输出流,并读取 HTML 文件作为报文体

AFilterChain:FilterPool 里面包含每个项目的所有 Filter 对象,根据 req 的 url 可以找到匹配的 Filter 链。

Session:创建 req 对象的时候会为它设置一个 session,在最后写报文头的时候如果 req 的 header 没有“Cookie”,就在报文头里写上 Set-Cookie:sessionId。

页面跳转:req 的 getRequestDispatcher 会重新进入一个 ProcessTwo(其功能如下图所示);resp 的 sendRedirect(xxx)会直接在 socket 输出流设置状态 302,并设置 Location:xxx,然后使服务器发送新请求。

(图一)总体直观图

测试工具

客户端有两个属性,port 和 JSessionID,port 用于每次断开后的连接,因为获取完之后关闭 IO 流时会断开连接。JSessionID 初始化为 null,一旦收到了服务器给的 Cookie 就会设置 SessionID 来保证后续访问的时候是同一个用户。

sendGet:sendGet 会调用 setGetHeader 函数来设置 GET 头,然后发送,获取网页的 Response 后去掉头部的信息并返回收到的结果。

sendPost:sendPost 会调用 sendGet 来获取页面然后通过 getServletName 来获取 Servlet,并且如果带有参数,会调用 getProjectName 来获取项目名然后用来转发和重定向到别的页面,如果参数出错,就会获取一个转发后但是结果错误的网页。

WebClient 中的 connect 函数是用来测试该端口是否能够连接的。

CompareUtil 中的 compare 函数有两个参数,是要比较的两个文件所在的文件路径,然后返回一个 double 类型的值作为相似度。

FileUtil 用来写入文件。

WebUtil 用来根据所给的正则表达式然后获取页面中的标签。

四、详细设计

4.1 模块接口设计

Web 服务器

总类图

过滤链

如何只调用 AFilterChain 的 doFilter(req,resp)函数,就能实现全过滤 + 发送终版 HTML,需要 AfilterChain(差不多是一个链表),它里面包含一个 Filter 对象,并有一个 next 引用下一个 AfilterChain 对象。

public class AFilterChain implements FilterChain {private Filter cur;public AFilterChain next;public void doFilter(ServletRequest req, ServletResponse resp) {if(cur == null) {ProcessTwo p = new ProcessTwo(req,resp);handle();}else {if(next == null) {Filter t = cur;cur = null;next = null;doFilter(req, resp, this);}else {Filter t = cur;cur = next.cur;next = next.next;doFilter(req, resp, this);}}}
}
servlet

Servlet 执行后获得的 HTML 页面放入本工程的 html/pro/xxx 里面,然后通过当时建立连接的 socket 的输出流发送报文头 +html/pro/xxx 里面的东西。

jsp

JSP 都会被转成 servlet 类,这个类的.java 代码会被装入 jsp_servlet/pro/xxx 里面,调用这个转译的 servlet 形成的 HTML 页面也会装入与上面一样的文件里面。

测试工具

WebClient 提供了两个接口,sendGet 和 sendPost,两个接口用于发送 GET 请求和 POST 请求,sendPost 的第二个参数 Map 可以为 null,此时就不会有提交表单这个操作。返回值都为 String,也就是网页 Response 的结果。

CompareUtil 中提供了一个 compare 方法,可以比较两个文件(不是文件夹)的相似度,返回值为 Double。

FileUtil 中提供了 write 文件的方法,用于写入文件。

WebUtil 中提供了 getTag 的方法,用来找到 Web 页面中的各种标签,并返回一个 String,如果没找到就返回 null。

五、系统成果展示

5.1 模块 1 Web 服务器

得到过滤链的测试

JSP 转 servlet

测试输出

5.2 模块 2 测试工具

通过 GET 获取并保存到 txt 文件中的结果 测试用例不丰富,不能说明问题

更多的结果在 results 中,下面的是使用测试工具比较的结果,文件名的前缀是请求方式,后面带&是请求时的参数键值对


资源下载地址:https://download.csdn.net/download/sheziqiong/85706486
资源下载地址:https://download.csdn.net/download/sheziqiong/85706486

基于Java实现的Web服务器与测试工具开发相关推荐

  1. linux下的web服务器压力测试工具之ab

    介绍 ab是apache附带的一款压力测试工具,它非常容易使用,ab可以直接在Web服务器本地发起测试请求.这至关重要,因为我们希望测试的服务器的处理时间,而不包含数据的网络传输时间以及用户PC本地的 ...

  2. Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍

    一.http_load程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会 ...

  3. Linux下四款Web服务器压力测试工具…

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不 ...

  4. web服务器压力测试工具

    2019独角兽企业重金招聘Python工程师标准>>> http_load 安装 #tar zxvf http_load-12mar2006.tar.gz #cd http_load ...

  5. 博客园首页新随笔联系管理订阅 Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍

    https://www.cnblogs.com/shipengzhi/archive/2012/10/09/2716766.html

  6. 基于Java技术的Web环境下分布式数据库互操作性的实现

                作者:李炽明 莫倩 徐明 1 JDBC工作原理 JDBC(Java Database Connectivity)是1个Sun公司注册了的商标,代表用来执行SQL语句的Java语 ...

  7. 基于Java毕业设计宠物论坛设计网站测试视频2021源码+系统+mysql+lw文档+部署软件

    基于Java毕业设计宠物论坛设计网站测试视频2021源码+系统+mysql+lw文档+部署软件 基于Java毕业设计宠物论坛设计网站测试视频2021源码+系统+mysql+lw文档+部署软件 本源码技 ...

  8. 基于JAVA实现的WEB端UI自动化 - WebDriver高级篇 - 关联

    文章目录 关联 (公共变量传递一些值) 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍 基于JAVA实现的WEB端UI自动化 - WebDriver基础篇 - 实现简单的浏览器操作 基于J ...

  9. 基于Go语言的Web服务器开发

    基于Go语言的Web服务器开发 本文将介绍使用Go语言来开发一个简单的Web服务器,其中将包括文件上传和下载功能. 必备条件 Go语言环境 一个文本编辑器 网络服务器 步骤一:编写server.go文 ...

最新文章

  1. Android广播监听usb插拔状态
  2. 万字长文,结合电商支付业务一文搞懂DDD
  3. 《LeetCode力扣练习》第155题 最小栈 Java
  4. 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )
  5. C# 多线程之Thread类
  6. 重庆邮电大学发布2021年最新小样本目标检测综述
  7. Android开发之高仿百度地图底部滑出菜单
  8. iPhone使用CoreTelephony获得SIM卡网络运营商资讯和通话资料
  9. 非关型数据库之Hbase
  10. XSS跨站脚本小结(转)
  11. iso硬盘安装 凤凰os_phoenix os安装全教程 凤凰系统进不去安装注意事项
  12. 科研笔记2:科技论文作图规范
  13. Matlab设置黑色背景
  14. 网易2019实习生招聘算法题(一)
  15. LiveData-原理全解析
  16. 钡铼技术IO模块—专业独立式io模块
  17. 微交易平台搭建开发-盘内实时K线对接
  18. VERTU全球首款WEB3手机METAVERTU伦敦亮相
  19. 词法分析——词法分析的任务
  20. 微信小程序-选择时间(一周的某一时刻)

热门文章

  1. leetcode 66. 加一-java简短代码实现
  2. ATT汇编程序代码控制(中英文对照)
  3. 如何分析日活跃用户异常波动
  4. python微信点赞脚本_Python爬取微信公众号评论、点赞等相关信息
  5. apap图像全景拼接
  6. 数据库的一些操作(Sql)
  7. 论物联网与大数据、云计算、工业物联网、区块链
  8. ROOT在Ubuntu18中安装出现的问题小解
  9. SpringBoot 整合Jest
  10. 邮件TLS/SSL加密通信