6ea70691c98dbd54698d64c127b90d3aad7a396b
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. 编译
go build -o webserver.exe .
2. 运行
./webserver.exe
或者
webserver.exe
3. 访问服务
- 主服务器:http://localhost:9000
- 管理控制台:http://localhost:9001
配置说明
默认配置(在 config.json 文件中):
{
"port": 9000,
"admin_port": 9001,
"root_dir": "./web"
}
可以通过修改 config.json 文件来更改配置:
port:HTTP 监听端口admin_port:管理控制台端口root_dir:静态文件根目录
功能验证
1. 正常访问(200 OK)
访问存在的页面:
curl http://localhost:9000/
curl http://localhost:9000/index.html
curl http://localhost:9000/test.html
2. 错误页面(404 Not Found)
访问不存在的页面:
curl http://localhost:9000/notfound.html
curl http://localhost:9000/missing-page
3. 不支持的方法(501 Not Implemented)
使用 POST 方法:
curl -X POST http://localhost:9000/test
4. 管理控制台功能
访问管理控制台查看:
- 实时访问日志
- 服务器状态
- 访问请求统计
- 清空日志功能
访问日志格式
日志输出格式:
[时间] 客户端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 内容或文件内容)
多线程并发
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 停止服务器,或直接关闭终端窗口。
Languages
Go
65.1%
HTML
32.4%
Batchfile
2.5%