Term project for Internet Computing (2022, Spring), aiming to implement HTTP client and server with Java socket API.
- 谭子悦
- 徐浩钦
- 陈骏
- 邱兴驰
- 李佳骏
基于Java Socket API搭建简单的HTTP客户端和服务器端程序
-
不允许基于netty等框架,完全基于Java Socket API进行编写
- 已实现
-
不分区使用的IO模型,BIO、NIO和AIO都可以
- 已基于NIO.2(AIO)实现
-
实现基础的HTTP请求、响应功能,具体要求如下:
3.1 HTTP客户端可以发送请求报文、呈现响应报文(命令行和GUI都可以)
- 完成
3.2 HTTP客户端对301、302、304的状态码做相应的处理
- 通过测试
3.3 HTTP服务器端支持GET和POST请求
- 通过测试
3.4 HTTP服务器端支持200、301、302、304、404、405、500的状态码
- 通过测试
3.5 HTTP服务器端实现长连接
- 通过测试
3.6 MIME至少支持三种类型,包含一种非文本类型
- 超额完成
-
基于以上的要求,实现注册,登录功能(数据无需持久化,存在内存中即可,只需要实现注册和登录的接口,可以使用postman等方法模拟请求发送,无需客户端)。
- 测试通过
-
Message Parser:
util.MessageHelper.MessageParser.-
Framework
-
Transfer-Encoding
- Content-Length
- Chunked
-
Content-Encoding
- Gzip
-
-
Message Packer
-
Framework
-
Transfer-Encoding
- Content-Length
- Chunked
-
Content-Encoding
- Gzip
-
-
Main loop:
HttpServer.launch -
Socket Handler:
HttpServer.handleSocket- Short connection
- Long connection
-
MIME types
-
Target Handler
- Request Methods
- Custom request (debug only):
HttpClientrequest(HttpRequestMessage request) - GET request
- POST request
- Custom request (debug only):
- Display
- CLI
- Status Handler
- 301 Moved Permanently
- 302 Found
- 304 Not Modified
- Global Header Map
- Verification Code Generator
- Temporary User Map
- Server Tests
- Main Loop
- Long Connection Test
- Manual Target Handler Test
- Manual MIME Test
- Client Tests
- Main Loop
- Status Handler Test
- Request Test
- Parser and Packer Test
- Content-Length Test
- Chunked Test
- File Tests
- Login System Tests
- Register
- Manual tests
- 首次打开或
git pull后打开项目时,务必 reload maven project - Lombok 需要启动 IntelliJ IDEA 的 Annotation Processor 才可使用, 初次 build project 时留意 IDEA 右下角的提示弹窗
- IDE 出现异常时记得 Invalidate Cache
-
所有的Debug信息都请使用 util.Log.debug() 输出,切勿直接使用任何stdio输出
- 多写Debug信息,便于自己调试也便于他人阅读
- 格式化输出请使用
“Various texts...”.formatted()
-
如需修改 [Public | Protected | Default] [methods | fields],请先在工作群中汇报
- Private [methods | fields] 可按需增加
-
JVM默认参数不启用assertion,因此推荐在 ./test/java/CustomTests.java 中编写自己的测试程序
- 不要随意修改别人的用例
-
编写不确定或逻辑复杂的部分时,请多写 Assertions
-
所有的命名请遵守 Java 规范
-
请不要从任何地方 (StackOverflow, GitHub, etc.) 直接复制代码到本项目中
-
填写复用纯文本 (如
GET,HTTP/1.1) 前,先检查项目中是否已定义对应常量,若无,可考虑增加该常量类 -
配置参数可以存为json文件放在
main/resources下,将文件路径作为常量存在util.Config中,并用util.Config中的方法读取 -
由于HTTP Message是 case insensitive 的,所以header, target等的解析和获取都要转换成全小写
- 不采用GZIP压缩传输时,传输稳定性会出现问题
- 已解决,问题并不在压缩传输或传输稳定性,在于并发问题。synchronized method只能防止同一object里的方法被并发调用,这时候不同object就可以同时访问他们共有的static member fields