从epoll到HTTP到Web框架,手写一个Web项目
发布日期: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. 其他功能

  • 登录状态:使用 cookie 记录登录状态,无 session 处理。
  • 数据初始化main.cppinit 方法读取数据文件。
  • 资源管理:EpollServer 注册退出信号,退出时保存数据文件,回收资源。
  • 连接监控summer_ 成员用于定时打印连接数,需开启注释处理。

  • 9. Web 框架

    框架功能简单,仅需在 BaseController::handle 中添加 URI 和处理方法。


    10. 未完成的功能

  • Json 解析器:扩展性差,建议替换。
  • 线程池:尚未实现。
  • 控制器分离:未实现,后续需规划。
  • 耦合性问题:服务器代码与 Web 后端耦合。
  • 安全性:账号和资金安全需加强。
  • 中文处理:可能存在偶发 bug。

  • 本项目仅为个人学习用途,技术水平有限,欢迎大佬批评指正!

    上一篇:子类句柄赋值给父类句柄,为什么是安全的?
    下一篇:有限状态自动机 解析HTTP请求头与body中的json

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年04月24日 14时48分44秒