diff --git a/README.md b/README.md index c0e4ae7..ba885fd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,178 @@ -# computer-network +# Simple Web Server 项目说明 -🎉 计算机网络课程设计 \ No newline at end of file +## 项目概述 +这是一个用 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 停止服务器,或直接关闭终端窗口。