Files
2026-03-30 22:05:16 +08:00

179 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Simple Web Server 项目说明
## 项目概述
这是一个用 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 停止服务器,或直接关闭终端窗口。