Files
computer-network/README.md
T

179 lines
5.0 KiB
Markdown
Raw Normal View History

2026-03-30 22:05:16 +08:00
# Simple Web Server 项目说明
2026-03-30 11:37:52 +08:00
2026-03-30 22:05:16 +08:00
## 项目概述
这是一个用 Go 语言实现的多线程 Web 服务器,作为计算机网络课程设计的成果。
## 功能特性
- ✅ **多线程并发处理**:使用 goroutine 处理并发客户端请求
- ✅ **HTTP GET 方法支持**:完整支持 HTTP/1.1 GET 请求
- ✅ **HTTP 请求解析**:解析请求行、HTTP 版本和头部
- ✅ **HTTP 响应构造**:自动构建符合 HTTP/1.1 标准的响应报文
- ✅ **状态码支持**:
- 200 OK - 成功获取资源
- 404 Not Found - 资源不存在
- 501 Not Implemented - 不支持的请求方法(仅支持 GET)
- ✅ **Content-Type 自动识别**:根据文件扩展名自动设置正确的 MIME 类型
- ✅ **访问日志记录**:控制台实时显示访问日志
- ✅ **Web 管理控制台**:图形化界面管理和监控服务器
- ✅ **日志管理功能**:在线清空访问日志
- ✅ **配置管理**:支持 JSON 格式的配置文件
## 项目结构
```
computer-network/
├── go.mod # Go 模块文件
├── main.go # 程序入口
├── config.json # 配置文件
├── config/
│ └── config.go # 配置管理(端口号、根目录等)
├── server/
│ ├── server.go # 服务器主逻辑(监听、并发处理)
│ ├── handler.go # HTTP 请求处理
│ ├── request.go # HTTP 请求解析
│ └── response.go # HTTP 响应构造
├── logger/
│ └── logger.go # 访问日志记录
├── admin/
│ └── admin.go # Web 管理控制台
└── web/ # 静态文件根目录
├── index.html # 主页
├── test.html # 测试页面
├── 404.html # 错误页面
└── 501.html # 501 错误页面
```
## 运行方法
### 1. 编译
```bash
go build -o webserver.exe .
```
### 2. 运行
```bash
./webserver.exe
```
或者
```bash
webserver.exe
```
### 3. 访问服务
- 主服务器:http://localhost:9000
- 管理控制台:http://localhost:9001
## 配置说明
默认配置(在 config.json 文件中):
```json
{
"port": 9000,
"admin_port": 9001,
"root_dir": "./web"
}
```
可以通过修改 config.json 文件来更改配置:
- `port`:HTTP 监听端口
- `admin_port`:管理控制台端口
- `root_dir`:静态文件根目录
## 功能验证
### 1. 正常访问(200 OK)
访问存在的页面:
```bash
curl http://localhost:9000/
curl http://localhost:9000/index.html
curl http://localhost:9000/test.html
```
### 2. 错误页面(404 Not Found)
访问不存在的页面:
```bash
curl http://localhost:9000/notfound.html
curl http://localhost:9000/missing-page
```
### 3. 不支持的方法(501 Not Implemented)
使用 POST 方法:
```bash
curl -X POST http://localhost:9000/test
```
### 4. 管理控制台功能
访问管理控制台查看:
- 实时访问日志
- 服务器状态
- 访问请求统计
- 清空日志功能
访问:http://localhost:9001
## 访问日志格式
日志输出格式:
```
[时间] 客户端IP 请求方法 请求URL HTTP版本 状态码 响应时间
```
示例:
```
[2025-03-30 12:34:56] 127.0.0.1 GET /index.html HTTP/1.1 200 15ms
[2025-03-30 12:35:02] 127.0.0.1 GET /notfound.html HTTP/1.1 404 5ms
[2025-03-30 12:36:10] 127.0.0.1 POST /test HTTP/1.1 501 2ms
```
## 技术实现
### HTTP 请求解析
- 读取 TCP 数据流
- 按换行符分割请求行和头部
- 提取方法、URL、HTTP 版本
- 解析头部键值对
### HTTP 响应构造
- 状态行(HTTP/1.1 状态码 描述)
- 响应头部(Content-Type、Content-Length 等)
- 响应体(HTML 内容或文件内容)
### 多线程并发
```go
for {
conn, err := listener.Accept()
if err != nil { continue }
go handleConnection(conn) // 每个连接一个 goroutine
}
```
### MIME 类型支持
- HTML: text/html
- CSS: text/css
- JavaScript: application/javascript
- JSON: application/json
- 图片: image/jpeg, image/png, image/gif 等
- 文本: text/plain
## 依赖
- Go 1.21+
- 仅使用 Go 标准库,无第三方依赖
## 课设要求完成情况
| 要求 | 状态 | 说明 |
|------|------|------|
| 设计控制界面 | ✅ | Web 管理控制台 + 控制台日志 |
| 配置端口号 | ✅ | JSON 配置文件 |
| 启动/停止服务器 | ✅ | Ctrl+C 优雅停止 |
| 实时访问日志 | ✅ | 控制台输出 + Web 界面 |
| 多线程处理并发请求 | ✅ | goroutine 并发 |
| 解析 HTTP 请求 | ✅ | 完整解析请求行和头部 |
| 支持 GET 方法 | ✅ | 完整支持 GET |
| 501 Not Implemented | ✅ | 非 GET 方法返回 501 |
| URL 到文件映射 | ✅ | 在根目录查找文件 |
| 200 OK 响应 | ✅ | 文件存在时返回 200 |
| 404 Not Found | ✅ | 文件不存在返回 404 |
| 响应头部构造 | ✅ | Content-Type、Content-Length |
| 使用 Go 语言 | ✅ | 完全使用 Go 实现 |
## 停止服务器
按 Ctrl+C 停止服务器,或直接关闭终端窗口。