# 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 停止服务器,或直接关闭终端窗口。