
从epoll到HTTP到Web框架,手写一个Web项目
登录状态:使用 cookie 记录登录状态,无 session 处理。 数据初始化: 资源管理:EpollServer 注册退出信号,退出时保存数据文件,回收资源。 连接监控:
Json 解析器:扩展性差,建议替换。 线程池:尚未实现。 控制器分离:未实现,后续需规划。 耦合性问题:服务器代码与 Web 后端耦合。 安全性:账号和资金安全需加强。 中文处理:可能存在偶发 bug。
发布日期:2021-05-18 10:36:18
浏览次数:22
分类:精选文章
本文共 2297 字,大约阅读时间需要 7 分钟。
项目介绍
本项目是一个基于C++的学习项目,旨在通过实践熟悉C++编程。从 epoll 服务器到 HTTP 服务器,再到 Web 后台,整个过程尽量减少依赖,使用 Boost 的字符串处理外,其他库均手撸实现。项目涵盖了用户注册、登录、充值、交易(转账)等功能。
在 epoll 服务器部分,参考了《Linux 系统编程》以及 Boost 的 Axio 示例,尤其是 HTTP 协议解析部分。在 Web 后台部分,结合自身的 Java Web 开发经验,编写了一个简单的实现。前端使用 Bootstrap 可视化编程,JQuery 写得较为基础。数据库采用 Linux 文件系统,仅实现了简单的文件加载和保存。
本项目的主要目的是技术学习,欢迎大佬指正和建议。
项目演示
1. 运行参数
使用 Clion 远程开发,具体环境参考以下:
- C++ 11
- CMake 3.19
- Ubuntu 16.04.7 LTS (GNU/Linux 4.15.0-136-generic x86_64)
- Clion 2021.1
直接使用 CMake 编译运行即可。
2. 功能展示
注册页面
注册完成后会记录登录状态,为后续操作提供基础支持。首页
注册成功后可立即进入首页,查看账户信息。充值功能
充值成功后,钱包余额将实时更新。转账功能
需要注册另外一个账号才能体验转账功能。3. 快速开始
环境要求
- C++ 11
- CMake 3.19
- Ubuntu 16.04.7 LTS (GNU/Linux 4.15.0-136-generic x86_64)
- Clion 2021.1
编译与运行
直接使用 CMake 编译运行:
cmake -D CMAKE_INSTALL_PREFIX=/usr/local ..sudo make install
运行参数格式:<项目地址> <端口> <前端文件夹> <数据库文件夹>
4. 项目结构
├── CMakeLists.txt├── main.cpp├── readme.md├── readme-img├── resources/│ ├── database/│ └── htmls/├── server/│ ├── include/│ │ ├── Constant.hpp│ │ ├── EpollConnection.hpp│ │ ├── EpollConnectionManager.hpp│ │ ├── EpollServer.hpp│ │ ├── Header.hpp│ │ ├── RequestHandler.hpp│ │ ├── Request.hpp│ │ ├── RequestParser.hpp│ │ └── Response.hpp│ └── src/└── web/ ├── core/ │ ├── GlobalAutoIds.cpp │ └── GlobalAutoIds.hpp ├── core/ │ └── Json.cpp │ └── Json.hpp └── src/ ├── controller/ └── service/ └── dao/ └── model/
5. epoll 服务器
5.1 基本逻辑
- socket fd:服务器 socket 描述符(sfd)
- cfd:客户端 socket 描述符
采用 epoll_wait
阻塞 + ET 模式 + cfd 非阻塞形式。
- epoll_wait 循环中只监听读事件;
- 对于 sfd 事件,执行
doAccept
; - 对于 cfd 事件,另起线程执行
doRead
,完成请求解析和响应。
5.2 并发处理
- 线程池:后续完善。
- 无状态设计:所有业务逻辑类均无状态,使用
static
修饰。 - 请求与响应:线程变量,不存在并发问题。
6. Web 后端
6.1 三层架构
由于对 C++ Web 开发不熟悉,参考 Java 的三层架构思想,尝试实现:
- Controller:控制层,处理 URI 映射。
- Service:业务逻辑层。
- DAO:持久层。
- Model:数据模型。
6.2 控制器实现
由于技术限制,暂时未实现多个控制器,直接使用一个 BaseControlle 类处理所有业务。
7. Web 前端
前端功能较为基础,主要通过 AJAX 请求实现用户交互。
8. 其他功能
main.cpp
中 init
方法读取数据文件。summer_
成员用于定时打印连接数,需开启注释处理。9. Web 框架
框架功能简单,仅需在 BaseController::handle
中添加 URI 和处理方法。
10. 未完成的功能
本项目仅为个人学习用途,技术水平有限,欢迎大佬批评指正!
发表评论
最新留言
很好
[***.229.124.182]2025年04月24日 14时48分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
遇到问题之-httpd服务启动报错182行错误
2019-03-15
pycharm如何设置(错误、警告类的标准提醒)
2019-03-15
PHP是世界上最好的语言?Phython第一个不服
2019-03-15
Bugku CTF-web6
2019-03-15
Bugku CTF-web10 头等舱
2019-03-15
UML-配置图
2019-03-15
JS高级面向对象(二)-构造函数和原型
2019-03-15
python入门到秃顶(10):异常
2019-03-15
ES6_变量生明
2019-03-15
考研复试英语问答
2019-03-15
百度背景换肤案例
2019-03-15
修改ng-zorro中table对齐及宽度等细节
2019-03-15
输出对象的值——踩坑
2019-03-15
angular2项目里使用排他思想
2019-03-15
折线图上放面积并隐藏XY轴的线
2019-03-15
Experience of tecent interview
2019-03-15
failed to push some refs to git
2019-03-15
在苹果Mac上如何更改AirDrop名称?
2019-03-15
1110 Complete Binary Tree (25 point(s))
2019-03-15