本项目是基于Maven构建的,使用IntelliJ IDEA开发的Java项目。运行前,需通过maven安装相关依赖。请确保本项目存放于英文路径下。
本项目使用了log4j2记录日志,为保证控制台日志信息有颜色,请先设置JVM参数:-Dlog4j.skipJansi=false
服务端运行后,打开http://localhost:5000/ ,经301重定向至 http://localhost:5000/index.html ,出现一个带图片的注册登录页面,说明项目配置正常。
实现基础的 HTTP 请求、响应功能,具体要求如下:
- HTTP客户端可以发送请求报文、呈现响应报文(命令行形式)
- HTTP客户端对301、302、304的状态码做相应的处理
- MIME 至少支持三种类型,包含一种非文本类型
- 编写测试文件以发起客户端的 Http 请求
- Client 类使用 Socket 通信
- Componets 内包括 Http 报文的 Header, Body, 以及 Http 请求和 Http 回复报文
- Handler 包括对请求和回复报文的相关类,其中请求时会查找永久重定向与缓存资源,得到回复后处理各种状态码
- LocalCache 内包括对重定向和请求资源的缓存相关类
-
Client类
-
SocketPool
-
RequestHandler
-
ResponseHandler
-
LastModifiedResourceCache
-
LocalResource
-
RedirectResourceCache
-
Utils包
首先编写测试文件 由于未设定 UA,网站未启用 Cache,故此测试用例结果将保持状态码为 200
请求服务器名为 "/movedIndex.html" 文件时,服务器将返回状态码301并告知新的路径 此时服务器将保存此次重定向结果,下一次请求 "/movedIndex.html" 时直接更改路径
请求服务器名为 "/movedIndex2.html" 文件时,服务器将返回状态码302并告知临时的新路径。此时客户端将重构此次请求,但不会缓存重定向结果。
若请求服务器的同一个资源两次,第一次请求完毕后该资源和 Last-Modified 值将被保存至缓存中;第二次请求时发现本地缓存,加上 If Modified Since 字段后请求服务器。若服务器资源未改变,则返回 304 代码以告知客户端直接使用缓存资源。
支持内容编码 gzip ,可参考第一个测试
在 Test302 测试文件中已覆盖超过三种 MIME 支持的测试
测试的逻辑是前三次请求不使用长连接,后两次请求使用长连接,socket连接只被创建4次,最后一次的连接复用第四次连接创建的socket。
测试代码如下:
测试结果如下:
从测试结果可以看到有四次"Create connection",有一次"Reuse connection"
实现基础的 HTTP 请求、响应功能,具体要求如下:
- HTTP 服务器端支持 GET 和 POST 请求
- HTTP 服务器端支持 200、301、302、304、404、405、500 的状态码
- HTTP 服务器端实现长连接
- MIME 至少支持三种类型,包含一种非文本类型
SimpleServer类负责启动主线程ServerHandler以监听请求。监听到连接请求,回调AcceptHandler,AcceptHandler回调RequestHandler处理Http信息。
Http包负责封装请求和响应。
Controller包负责匹配路径并分发指令(如GET静态资源等),其中RequestMapper是仿Springboot控制器风格的uri匹配器,内含的Router包是uri匹配器和路由的具体实现。
Services包负责处理静态资源和业务逻辑,生成http响应。
Common包存放状态码等枚举。StaticResouces文件夹下放了一个演示网页。
-
Common包
-
RequestMapper
-
AcceptHandler
-
KeepAliveHandler
-
ServerHandler
-
RequestHandler
-
Service包
-
Http包
浏览器GET请求静态资源,服务端呈现请求报文:
服务器响应200状态码
浏览器地址栏访问 http://localhost:5000/register ,以GET方法请求注册为POST的接口
响应405
浏览器地址栏访问 http://localhost:5000/error ,服务端内方法抛出异常
响应500
已在客户端部分给出详细测试说明。
已在客户端部分给出详细测试说明。