Skip to content

Commit 190afe1

Browse files
committed
Docs writing...
1 parent 84b3d1e commit 190afe1

File tree

7 files changed

+161
-246
lines changed

7 files changed

+161
-246
lines changed

README.md

Lines changed: 2 additions & 246 deletions
Original file line numberDiff line numberDiff line change
@@ -1,247 +1,3 @@
1-
# ICProject-HTTPImpl
2-
Term project for Internet Computing (2022, Spring), aiming to implement HTTP client and server with Java socket API.
1+
# HTTP Client/Server for Java
32

4-
## 成员
5-
6-
- 谭子悦
7-
- 徐浩钦
8-
- 陈骏
9-
- 邱兴驰
10-
- 李佳骏
11-
12-
# 1 概览
13-
基于Java Socket API搭建简单的HTTP客户端和服务器端程序
14-
15-
## 1.1 说明
16-
1. 不允许基于netty等框架,完全基于Java Socket API进行编写
17-
18-
- [x] 已实现
19-
20-
2. 不分区使用的IO模型,BIO、NIO和AIO都可以
21-
22-
- [x] 已基于NIO.2(AIO)实现
23-
24-
3. 实现基础的HTTP请求、响应功能,具体要求如下:
25-
26-
3.1 HTTP客户端可以发送请求报文、呈现响应报文(命令行和GUI都可以)
27-
28-
- [ ] 未完全完成
29-
30-
3.2 HTTP客户端对301、302、304的状态码做相应的处理
31-
32-
- [x] 通过测试
33-
34-
3.3 HTTP服务器端支持GET和POST请求
35-
36-
- [x] 通过测试
37-
38-
3.4 HTTP服务器端支持200、301、302、304、404、405、500的状态码
39-
40-
- [x] 通过测试
41-
42-
3.5 HTTP服务器端实现长连接
43-
44-
- [x] 通过测试
45-
46-
3.6 MIME至少支持三种类型,包含一种非文本类型
47-
48-
- [x] 超额完成
49-
50-
4. 基于以上的要求,实现注册,登录功能(数据无需持久化,存在内存中即可,只需要实现注册和登录的接口,可以使用postman等方法模拟请求发送,无需客户端)。
51-
52-
- [x] 测试通过
53-
54-
### 实现情况
55-
56-
## 1.2 任务
57-
58-
- [x] Message Parser: `util.MessageHelper.MessageParser`.
59-
- [x] Framework
60-
- [x] Transfer-Encoding
61-
- [x] Content-Length
62-
- [x] Chunked
63-
64-
- [x] Content-Encoding
65-
- [x] Gzip
66-
67-
- [x] Message Packer
68-
69-
- [x] Framework
70-
- [x] Transfer-Encoding
71-
- [x] Content-Length
72-
- [x] Chunked
73-
74-
- [x] Content-Encoding
75-
- [x] Gzip
76-
77-
78-
### 1.2.1 Http Server
79-
80-
- [x] Main loop: `HttpServer.launch`
81-
82-
- [x] Socket Handler: `HttpServer.handleSocket`
83-
- [x] Short connection
84-
- [x] Long connection
85-
86-
- [x] MIME types
87-
88-
- [x] Target Handler
89-
90-
### 1.2.2 Http Client
91-
92-
- [x] Request Methods
93-
- [x] Custom request (debug only): `HttpClientrequest(HttpRequestMessage request)`
94-
- [x] GET request
95-
- [x] POST request
96-
- [ ] Display
97-
- [ ] CLI
98-
- [x] Status Handler
99-
- [x] 301 Moved Permanently
100-
- [x] 302 Found
101-
- [x] 304 Not Modified
102-
103-
### 1.2.3 Login System (Server only)
104-
105-
- [x] Global Header Map
106-
- [x] Verification Code Generator
107-
- [x] Temporary User Map
108-
109-
### 1.2.4 Test Cases
110-
111-
- [x] Server Tests
112-
- [x] Main Loop
113-
- [x] Long Connection Test
114-
- [x] Manual Target Handler Test
115-
- [x] Manual MIME Test
116-
- [x] Client Tests
117-
- [x] Main Loop
118-
- [x] Status Handler Test
119-
- [x] Request Test
120-
- [x] Parser and Packer Test
121-
- [x] Content-Length Test
122-
- [x] Chunked Test
123-
- [x] File Tests
124-
- [x] Login System Tests
125-
- [x] Register
126-
- [x] Manual tests
127-
128-
### 1.2.x Suggestions
129-
130-
131-
## 1.3 代码结构图
132-
133-
Updated on May 22, 2022
134-
135-
```
136-
.
137-
├── Data
138-
│   ├── Client
139-
│   ├── Server
140-
│   └── Test
141-
├── README.md
142-
├── docs
143-
├── pom.xml
144-
└── src
145-
   ├── main
146-
   │   ├── java
147-
   │   │   ├── client
148-
   │   │   │   ├── ClientDriver.java
149-
   │   │   │   ├── HttpClient.java
150-
   │   │   │   ├── HttpRequestMessage.java
151-
   │   │   │   └── StatusHandler.java
152-
   │   │   ├── exception
153-
   │   │   │   └── InvalidMessageException.java
154-
   │   │   ├── server
155-
   │   │   │   ├── HttpResponseMessage.java
156-
   │   │   │   ├── HttpServer.java
157-
   │   │   │   ├── Mapping.java
158-
   │   │   │   ├── ResponseMessageFactory.java
159-
   │   │   │   ├── TargetHandler.java
160-
   │   │   │   └── target
161-
   │   │   │   ├── Common.java
162-
   │   │   │   ├── Html.java
163-
   │   │   │   ├── LoginSystem.java
164-
   │   │   │   └── TargetSet.java
165-
   │   │   └── util
166-
   │   │   ├── Config.java
167-
   │   │   ├── HttpMessage.java
168-
   │   │   ├── Log.java
169-
   │   │   ├── MessageHelper.java
170-
   │   │   ├── consts
171-
   │   │   │   ├── Headers.java
172-
   │   │   │   └── WebMethods.java
173-
   │   │   ├── packer
174-
   │   │   │   ├── MessagePacker.java
175-
   │   │   │   └── encode
176-
   │   │   │   ├── ContentGzipStrategy.java
177-
   │   │   │   ├── EncodeStrategy.java
178-
   │   │   │   ├── SourceStrategy.java
179-
   │   │   │   ├── TransChunkedStrategy.java
180-
   │   │   │   └── TransContentLengthStrategy.java
181-
   │   │   └── parser
182-
   │   │   ├── CustomizedReader.java
183-
   │   │   ├── MessageParser.java
184-
   │   │   ├── contentdecode
185-
   │   │   │   ├── ContentDecodeStrategy.java
186-
   │   │   │   └── GzipStrategy.java
187-
   │   │   └── transdecode
188-
   │   │   ├── ChunkedStrategy.java
189-
   │   │   ├── ContentLengthStrategy.java
190-
   │   │   └── TransDecodeStrategy.java
191-
   │   └── resources
192-
   │   ├── default_status_text.json
193-
   │   ├── global_headers.json
194-
   │   ├── mime.json
195-
   │   └── target_path.json
196-
   └── test
197-
   └── java
198-
   ├── CustomTests.java
199-
   ├── PackerAndParserTest.java
200-
   ├── clienttests
201-
   │   ├── RequestTest.java
202-
   │   ├── StatusHandlerTest.java
203-
   │   └── WANTest.java
204-
   ├── loginsystemtests
205-
   │   └── LoginSystemTests.java
206-
   ├── servertests
207-
   │   ├── LongConnectionTest.java
208-
   │   ├── MIMETest.java
209-
   │   ├── ServerTests.java
210-
   │   └── TargetHandlerTest.java
211-
   └── util
212-
   └── Util.java
213-
```
214-
215-
216-
# 2. 注意事项
217-
218-
## 2.1 配置与启动
219-
220-
- 首次打开或`git pull`后打开项目时,务必 reload maven project
221-
- Lombok 需要启动 IntelliJ IDEA 的 Annotation Processor 才可使用, 初次 build project 时留意 IDEA 右下角的提示弹窗
222-
- IDE 出现异常时记得 Invalidate Cache
223-
224-
## 2.2 项目编写
225-
226-
- 所有的Debug信息都请使用 util.Log.debug() 输出,切勿直接使用任何stdio输出
227-
- 多写Debug信息,便于自己调试也便于他人阅读
228-
- 格式化输出请使用 `“Various texts...”.formatted()`
229-
- 如需修改 [Public | Protected | Default] [methods | fields],请先在工作群中汇报
230-
- Private [methods | fields] 可按需增加
231-
- JVM默认参数不启用assertion,因此推荐在 ./test/java/CustomTests.java 中编写自己的测试程序
232-
- 不要随意修改别人的用例
233-
- 编写不确定或逻辑复杂的部分时,请多写 [Assertions](https://www.geeksforgeeks.org/assertions-in-java/)
234-
235-
- 所有的命名请遵守 Java 规范
236-
- 请不要从任何地方 (StackOverflow, GitHub, etc.) 直接复制代码到本项目中
237-
238-
- 填写复用纯文本 (如 `GET`, `HTTP/1.1`) 前,先检查项目中是否已定义对应常量,若无,可考虑增加该常量类
239-
240-
- 配置参数可以存为json文件放在`main/resources`下,将文件路径作为常量存在`util.Config`中,并用`util.Config`中的方法读取
241-
242-
- 由于HTTP Message是 case insensitive 的,所以header, target等的解析和获取都要转换成全小写
243-
244-
# 3. Notes
245-
246-
- 不采用GZIP压缩传输时,传输稳定性会出现问题
247-
- 已解决,问题并不在压缩传输或传输稳定性,在于并发问题。synchronized method只能防止同一object里的方法被并发调用,这时候不同object就可以同时访问他们共有的static member fields
3+
由Java Socket API实现的简单HTTP Client与Http Server

0 commit comments

Comments
 (0)