当前位置: 首页 > news >正文

[项目][WebServer][整体框架设计]详细讲解

目录

  • 0.框架 && 前言
  • 1.TcpServer类
    • 1.功能
    • 2.类设计
  • 2.HttpServer类
    • 1.功能
    • 2.类设计
  • 3.Request类 && Response类
    • 1.功能
    • 2.Request类设计
    • 3.Response类设计
  • 4.EndPoint类
    • 1.功能
    • 2.类设计
  • 5.Task类
    • 1.功能
    • 2.类设计
  • 6.ThreadPool类
    • 1.功能
    • 2.类设计


0.框架 && 前言

  • 程序main()函数如下
    void Usage(std::string proc)
    {std::cout << "Usage:\n\t" << proc << " Port" << std::endl;
    }int main(int argc, char *argv[])
    {if(argc != 2){Usage(argv[0]);exit(4);}std::unique_ptr<HttpServer> httpServer(new HttpServer(atoi(argv[1])));httpServer->Init();httpServer->Loop();return 0;
    }
    
  • 本项目将分模块设计,主要包含以下模块
  • 注意:本篇只放函数声明

1.TcpServer类

1.功能

  • 主要负责底层的TCP通信
  • 将其设计为单例模式,作为一个组件,置入HTTPServer中

2.类设计

static const uint16_t PORT = 8090;
static const int BACKLOG = 128;// 单例 -- 饿汉模式
class TcpServer
{
public:static TcpServer* GetInstance(uint16_t port = PORT){}void Init(){}void Socket(){}void Bind(){}void Listen(){}int Sock(){}~TcpServer(){}
private:TcpServer(uint16_t port): _port(port), _listenSock(-1){}TcpServer(const TcpServer&) = delete;
private:uint16_t _port;int _listenSock;static TcpServer* svr;
};TcpServer* TcpServer::svr = nullptr;

2.HttpServer类

1.功能

  • 主要负责HTTP协议的通信
  • 其中主要包括以下模块
    • TcpServer
    • ThreadPool
    • TaskQueue

2.类设计

class HttpServer
{
public:HttpServer(int port = PORT): _port(port), _stop(false){}void Init(){}void Loop(int threadNum = THREAD_POOL_NUM){}
private:uint16_t _port;bool _stop;
};

3.Request类 && Response类

1.功能

  • Request类负责存储接收到的请求及解析结果
  • ReSponse类用来构建响应

2.Request类设计

struct HttpRequest
{std::string request_line;std::vector<std::string> request_header;std::string blank;std::string request_body;// 解析结果std::string method;std::string uri;std::string version;std::unordered_map<std::string, std::string> headerMap;size_t content_length;std::string path;std::string suffix;std::string arg;bool cgi;HttpRequest(): content_length(0), cgi(false){}
};

3.Response类设计

struct HttpResponse
{std::string status_line;std::vector<std::string> response_header;std::string blank;std::string response_body;int status_code;int fd;int fSize;HttpResponse(): status_code(OK), fd(-1), blank(LINE_END){}
};

4.EndPoint类

1.功能

  • 负责两端业务处理,主要包括以下功能
    • 读取请求、分析请求、构建响应、IO通信
    • 该类为本项目主要设计方向

2.类设计

class EndPoint
{
public:EndPoint(int sock): _sock(sock), _stop(false){}~EndPoint(){}void RecvRequest(){}void BuildResponse(){}void SendResponse(){}bool IsStop(){}private:bool RecvRequestLine(){}bool RecvRequestHeader(){}void ParseRequestLine(){}void ParseRequestHeader(){}bool IsRecvRequestBody(){}bool RecvRequestBody(){}int ProcessNonCgi(){}int ProcessCgi(){}void BuildResponseHelper(){}void BuildOKResponse(){}void HandlerError(std::string page){}private:int _sock;bool _stop;HttpRequest _request;HttpResponse _response;
};

5.Task类

1.功能

  • 将HTTP请求构建成一个任务,以便ThreadPool管理任务队列,一定程度上和ThreadPool一起缓解了服务器压力

2.类设计

class Task
{
public:void ProcessOn(){}Task(){}Task(int sock): _sock(sock){}~Task(){}
private:int _sock;CallBack _handler; // 设置回调
};

6.ThreadPool类

1.功能

  • 线程池,分配任务给各线程,使其处理请求
  • 主要解决问题
    • 大量链接过来导致服务器内部进程或者线程暴增,进而导致服务器效率严重降低或者挂掉
    • 节省链接请求到来时,创建线程的时间成本
      • 提前创建好了一批线程,来任务时处理任务,没有任务时,让线程休眠
    • 让服务器的效率在一个恒定的稳定区间内
      • 线程个数不增多,CPU调度成本基本不变

2.类设计

static const int THREAD_POOL_NUM = 10;// 单例模式
class ThreadPool
{
public:static ThreadPool *GetInstance(int num = THREAD_POOL_NUM){}static void *ThreadRoutine(void *args){}bool Init(){}void Push(const Task& task) // in{}void Pop(Task& task) // out{}void ThreadWait(){}void ThreadWakeUp(){}bool TaskQueueIsEmpty(){}void Lock(){}void Unlock(){}bool IsStop(){}~ThreadPool(){}
private:ThreadPool(int num = THREAD_POOL_NUM): _num(num), _stop(false){}ThreadPool(const ThreadPool &) = delete;
private:int _num;bool _stop;std::queue<Task> _taskQueue;pthread_mutex_t _mtx;pthread_cond_t _cond;static ThreadPool *_tp;
};ThreadPool* ThreadPool::_tp = nullptr;

相关文章:

[项目][WebServer][整体框架设计]详细讲解

目录 0.框架 && 前言1.TcpServer类1.功能2.类设计 2.HttpServer类1.功能2.类设计 3.Request类 && Response类1.功能2.Request类设计3.Response类设计 4.EndPoint类1.功能2.类设计 5.Task类1.功能2.类设计 6.ThreadPool类1.功能2.类设计 0.框架 && 前言…...

SprinBoot+Vue网上购物商城的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…...

【数据结构】2——二叉树遍历

数据结构2——二叉树遍历 单纯记录 文章目录 数据结构2——二叉树遍历一、二叉树遍历1&#xff0c;先序遍历&#xff1a;根左右递归实现非递归实现&#xff08;栈&#xff09; 2.中序遍历&#xff1a;左根右递归非递归 3 .后序遍历&#xff1a;左右根递归非递归&#xff08;两…...

数据结构应用实例(五)——关键路径

Content: 一、问题描述二、算法思想三、代码实现四、小结 一、问题描述 设计实现 AOE 网的关键活动与关键路径问题&#xff1b; 二、算法思想 获取拓扑序列&#xff1b;计算节点的最早开始时间 v e [ i ] ve[i] ve[i]&#xff1b;计算节点的最晚开始时间 v l [ j ] vl[j] v…...

组播 2024 9 11

PIM&#xff08;Protocol Independent Multicast&#xff09;是一种常用的组播路由协议&#xff0c;其独立于底层的单播路由协议&#xff0c;能够在多种网络环境中有效地实现多播路由功能。PIM主要有两种模式&#xff1a;PIM Sparse Mode (PIM-SM) 和 PIM Dense Mode (PIM-DM)&…...

揭秘开发者的效率倍增器:编程工具的选择与应用

文章目录 每日一句正能量前言工具介绍功能特点&#xff1a;使用场景&#xff1a;提高工作效率的方式&#xff1a; 效率对比未来趋势后记 每日一句正能量 这推开心窗之人&#xff0c;可以是亲朋好友&#xff0c;也可以是陌客路人&#xff0c;可以是德高望重的哲人名流&#xff0…...

在AI的时代,程序员如何才不被淘汰

随着人工智能技术的迅猛发展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;正逐渐成为IT行业的热点。对于程序员来说&#xff0c;转行大模型领域不仅意味着新的机遇&#xff0c;也面临着诸多挑战。本文将探讨程序员转行大模型的机遇与挑战&#xff0c…...

tabBar设置底部菜单选项以及iconfont图标,setTabBar设置TabBar和下拉刷新API

tabBartabBar属性:设置底部 tab 的表现 ​ ​ ​ ​ 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…...

2024C题prompt

题目 我正在进行数学建模&#xff0c;需要你为我提供帮助。下面我会将赛题背景和问题发送给你&#xff0c;请你为我提供比赛思路和指导。 以下是赛题背景和赛题说明&#xff0c;不是问题: 农作物的种植策略 根据乡村的实际情况&#xff0c;充分利用有限的耕地资源&#xff0c…...

Numpy中数组的形状处理

目录 将多维数组降为一维数组竖直方向或水平方向数组的堆叠 数组形状处理的手段主要有reshape&#xff0c;resize&#xff0c;ravel&#xff0c;flatten&#xff0c;vstack&#xff0c;hstack&#xff0c;row_stack&#xff0c;column_stack,下面通过简单 的案例来解释这些方法…...

【动态规划】子序列问题二(数组中不连续的一段)

子序列问题二 1.最长定差子序列2.最长的斐波那契子序列的长度3.最长等差数列4.等差数列划分 II - 子序列 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&am…...

可视耳勺方便吗?可视耳勺热销第一名品牌!

在生活中&#xff0c;耳部清洁是我们常常会关注却又容易忽视细节的一项日常护理。传统挖耳勺有着不可视的局限性&#xff0c;只能凭感觉和经验反复刮蹭耳朵&#xff0c;很容易将耳垢越捅越深&#xff0c;而且还会刮伤耳道。因此&#xff0c;可视耳勺应运而生&#xff0c;它通过…...

micropython 3-wire spi 9bit 写入的问题

网上猛找把&#xff0c;没有&#xff0c;找不到&#xff0c;mpy不愧是没朋友的缩写&#xff0c;没有咋办&#xff0c;自己造&#xff01; 此库特别适用那些rgb屏的初始化&#xff0c;大多用3线spi&#xff0c;好家伙rgb用了十多个引脚现在想起来省引脚了是吧&#xff0c;就差这…...

导致JVM内存泄露的ThreadLocal详解

1. ThreadLocal介绍 1.1 什么是ThreadLocal Java官方文档中的描述&#xff1a;ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问&#xff08;通过get和set方法访问&#xff09;时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来…...

windows下关闭解除占用端口的进程

环境&#xff1a;windows 10 场景&#xff1a;启动某一应用程序时&#xff0c;提示其他应用已占用此端口&#xff0c;比如端口2425。 解决步骤&#xff1a; 1/3、打开windows的命令提示符&#xff0c;输入以下命令&#xff0c;查找占用此端口2425的PID号&#xff1a; # win…...

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(Python)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;Python&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPI…...

版权与开源协议:一场创新与自由的边界之争

在数字时代的浪潮中&#xff0c;版权与开源协议作为知识产权领域的两大支柱&#xff0c;既相互依存又暗自较劲&#xff0c;共同绘制着科技创新的宏伟蓝图。本文将带您深入这场创新与自由的边界之争&#xff0c;探讨版权与开源协议之间的微妙关系&#xff0c;以及它们如何共同推…...

学生用的蓝牙耳机推荐有哪些?实测四款实力出众机型!

在当今数字化学习环境中&#xff0c;学生对蓝牙耳机的需求日益增长&#xff0c;无论是在线课程的学习、图书馆的集中阅读还是日常通勤中的音频资料复习&#xff0c;一款性能优异、舒适度高且价格合理的蓝牙耳机对学生来说至关重要&#xff0c;面对市场上琳琅满目的产品选择&…...

MIT6.824 课程-GFS

GFS 原文&#xff1a;https://zhuanlan.zhihu.com/p/113161014 搬运用于参考学习 概述 存储&#xff08;Storage&#xff09;是一个非常关键的抽象&#xff0c;用途广泛。 GFS 论文还提到了很多关于容错、备份和一致性的问题。 GFS 本身是 Google 内部一个很成功的实用系统&…...

力扣第200题 岛屿数量

前言 记录一下刷题历程 力扣第200题 岛屿数量 岛屿数量 原题目&#xff1a; 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平…...

别再乱选了!Ansys EDA桌面版导入IBIS模型,Pin Import和Buffer Import到底怎么用?

Ansys EDA桌面版IBIS模型导入指南&#xff1a;Pin Import与Buffer Import深度解析 在信号完整性(SI)和电源完整性(PI)仿真领域&#xff0c;IBIS模型的使用一直是工程师们关注的焦点。作为行业标准的Ansys EDA工具链&#xff08;原E-desktop&#xff09;提供了强大的SIPI仿真能…...

Qt5新手必看:3分钟搞定你的第一个控制台程序(附完整代码)

Qt5入门实战&#xff1a;从零构建控制台应用的完整指南 引言&#xff1a;为什么选择Qt5作为开发起点&#xff1f; 对于刚接触C图形界面开发的程序员来说&#xff0c;Qt框架提供了一个绝佳的起点。它不仅拥有跨平台特性&#xff0c;还具备完善的工具链和丰富的模块库。控制台程序…...

游戏报错终极解决方案 DirectX修复工具深度解析

在Windows操作系统环境下&#xff0c;DirectX组件是游戏和多媒体软件运行的核心基础。 随着游戏产业的快速发展&#xff0c;越来越多的玩家在运行游戏时遇到了各种技术问题。 其中&#xff0c;DirectX组件缺失、损坏、报错是最为常见的问题之一&#xff0c;严重影响了用户的游戏…...

STM32串口环形队列IAP固件更新方案

基于STM32串口环形队列的IAP实现方案1. 项目概述1.1 系统架构本方案实现了一种基于STM32F103C8T6微控制器的串口IAP(In-Application Programming)系统&#xff0c;采用环形队列缓冲机制解决有限SRAM空间下的固件更新问题。系统将64KB Flash空间划分为四个功能区域&#xff1a;B…...

跨引擎资源无缝迁移:Unity到Godot的资产转换革新方案

跨引擎资源无缝迁移&#xff1a;Unity到Godot的资产转换革新方案 【免费下载链接】unitypackage_godot Import assets from UnityPackage files into Godot 项目地址: https://gitcode.com/gh_mirrors/un/unitypackage_godot 在游戏开发领域&#xff0c;引擎间的资源迁移…...

Mermaid:文本驱动的可视化引擎深度指南

Mermaid&#xff1a;文本驱动的可视化引擎深度指南 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器&#xff0c;支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图的开发者。 …...

数字电路设计避坑指南:RS触发器和JK触发器的常见应用误区与波形分析

数字电路设计避坑指南&#xff1a;RS触发器和JK触发器的常见应用误区与波形分析 在数字电路设计中&#xff0c;触发器作为时序逻辑的基础单元&#xff0c;其稳定性和可靠性直接影响整个系统的性能。RS触发器和JK触发器作为两种最常用的触发器类型&#xff0c;看似简单的逻辑背…...

目前专业的LED数码管屏厂商哪家好

在现代显示技术领域&#xff0c;LED数码管屏因其高亮度、低功耗和长寿命等特点&#xff0c;广泛应用于各种电子设备中。选择一家专业的LED数码管屏厂商至关重要。本文将为您推荐几家市场上表现突出的厂商&#xff0c;并进行详细对比。1. 杭州斡能电子有限公司公司简介&#xff…...

苹果内购订阅的“时间陷阱”:如何正确处理UTC与东八区的时间转换(附Java代码)

苹果订阅时间戳的时区陷阱&#xff1a;UTC与东八区转换的实战指南 1. 为什么时间戳处理如此重要&#xff1f; 在苹果应用内购&#xff08;IAP&#xff09;订阅系统中&#xff0c;时间戳处理看似简单&#xff0c;实则暗藏玄机。许多开发者都曾踩过这样的坑&#xff1a;用户明明购…...

Buildroot构建根文件系统时,为什么你的rootfs.tar总比别人的大?深度解析裁剪技巧

Buildroot构建根文件系统时rootfs.tar体积优化实战指南 当你在嵌入式Linux开发中使用Buildroot构建根文件系统时&#xff0c;是否经常遇到生成的rootfs.tar文件体积过大的问题&#xff1f;本文将深入解析Buildroot的打包机制&#xff0c;揭示那些容易被忽视的体积膨胀陷阱&…...