[项目][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 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…...
【数据结构】2——二叉树遍历
数据结构2——二叉树遍历 单纯记录 文章目录 数据结构2——二叉树遍历一、二叉树遍历1,先序遍历:根左右递归实现非递归实现(栈) 2.中序遍历:左根右递归非递归 3 .后序遍历:左右根递归非递归(两…...
数据结构应用实例(五)——关键路径
Content: 一、问题描述二、算法思想三、代码实现四、小结 一、问题描述 设计实现 AOE 网的关键活动与关键路径问题; 二、算法思想 获取拓扑序列;计算节点的最早开始时间 v e [ i ] ve[i] ve[i];计算节点的最晚开始时间 v l [ j ] vl[j] v…...
组播 2024 9 11
PIM(Protocol Independent Multicast)是一种常用的组播路由协议,其独立于底层的单播路由协议,能够在多种网络环境中有效地实现多播路由功能。PIM主要有两种模式:PIM Sparse Mode (PIM-SM) 和 PIM Dense Mode (PIM-DM)&…...
揭秘开发者的效率倍增器:编程工具的选择与应用
文章目录 每日一句正能量前言工具介绍功能特点:使用场景:提高工作效率的方式: 效率对比未来趋势后记 每日一句正能量 这推开心窗之人,可以是亲朋好友,也可以是陌客路人,可以是德高望重的哲人名流࿰…...
在AI的时代,程序员如何才不被淘汰
随着人工智能技术的迅猛发展,大模型(Large Language Models, LLMs)正逐渐成为IT行业的热点。对于程序员来说,转行大模型领域不仅意味着新的机遇,也面临着诸多挑战。本文将探讨程序员转行大模型的机遇与挑战,…...
tabBar设置底部菜单选项以及iconfont图标,setTabBar设置TabBar和下拉刷新API
tabBartabBar属性:设置底部 tab 的表现 首先在pages.json页面写一个tabBar对象,里面放入list对象数组,里面至少要有2个、最多5个 tab, 如果只有一个tab的话,H5(浏览器)依然可以显示底部有一个导航栏,如果没有,需要重启后才有,小程序则报错,只有2个以上才可以…...
2024C题prompt
题目 我正在进行数学建模,需要你为我提供帮助。下面我会将赛题背景和问题发送给你,请你为我提供比赛思路和指导。 以下是赛题背景和赛题说明,不是问题: 农作物的种植策略 根据乡村的实际情况,充分利用有限的耕地资源,…...
Numpy中数组的形状处理
目录 将多维数组降为一维数组竖直方向或水平方向数组的堆叠 数组形状处理的手段主要有reshape,resize,ravel,flatten,vstack,hstack,row_stack,column_stack,下面通过简单 的案例来解释这些方法…...
【动态规划】子序列问题二(数组中不连续的一段)
子序列问题二 1.最长定差子序列2.最长的斐波那契子序列的长度3.最长等差数列4.等差数列划分 II - 子序列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&am…...
可视耳勺方便吗?可视耳勺热销第一名品牌!
在生活中,耳部清洁是我们常常会关注却又容易忽视细节的一项日常护理。传统挖耳勺有着不可视的局限性,只能凭感觉和经验反复刮蹭耳朵,很容易将耳垢越捅越深,而且还会刮伤耳道。因此,可视耳勺应运而生,它通过…...
micropython 3-wire spi 9bit 写入的问题
网上猛找把,没有,找不到,mpy不愧是没朋友的缩写,没有咋办,自己造! 此库特别适用那些rgb屏的初始化,大多用3线spi,好家伙rgb用了十多个引脚现在想起来省引脚了是吧,就差这…...
导致JVM内存泄露的ThreadLocal详解
1. ThreadLocal介绍 1.1 什么是ThreadLocal Java官方文档中的描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来…...
windows下关闭解除占用端口的进程
环境:windows 10 场景:启动某一应用程序时,提示其他应用已占用此端口,比如端口2425。 解决步骤: 1/3、打开windows的命令提示符,输入以下命令,查找占用此端口2425的PID号: # win…...
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(Python)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量(Python) Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPI…...
版权与开源协议:一场创新与自由的边界之争
在数字时代的浪潮中,版权与开源协议作为知识产权领域的两大支柱,既相互依存又暗自较劲,共同绘制着科技创新的宏伟蓝图。本文将带您深入这场创新与自由的边界之争,探讨版权与开源协议之间的微妙关系,以及它们如何共同推…...
学生用的蓝牙耳机推荐有哪些?实测四款实力出众机型!
在当今数字化学习环境中,学生对蓝牙耳机的需求日益增长,无论是在线课程的学习、图书馆的集中阅读还是日常通勤中的音频资料复习,一款性能优异、舒适度高且价格合理的蓝牙耳机对学生来说至关重要,面对市场上琳琅满目的产品选择&…...
MIT6.824 课程-GFS
GFS 原文:https://zhuanlan.zhihu.com/p/113161014 搬运用于参考学习 概述 存储(Storage)是一个非常关键的抽象,用途广泛。 GFS 论文还提到了很多关于容错、备份和一致性的问题。 GFS 本身是 Google 内部一个很成功的实用系统&…...
力扣第200题 岛屿数量
前言 记录一下刷题历程 力扣第200题 岛屿数量 岛屿数量 原题目: 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平…...
避开这些坑,你的蓝桥杯单片机程序也能拿高分:EEPROM存储与电压比较逻辑详解
蓝桥杯单片机高分秘籍:EEPROM存储与电压比较逻辑的深度优化 在蓝桥杯单片机竞赛中,能够完成基本功能只是及格线,真正决定成绩高低的是对细节的掌控和边界条件的处理。许多参赛者在EEPROM数据存储和复杂电压比较逻辑这两个关键环节频频失分&am…...
Beyond Compare 5密钥生成终极指南:3分钟完成软件激活的完整解决方案
Beyond Compare 5密钥生成终极指南:3分钟完成软件激活的完整解决方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否正在为Beyond Compare 5的"评估模式错误"而烦恼…...
mimalloc内存分配器深度解析:高性能多线程环境下的内存管理优化方案
mimalloc内存分配器深度解析:高性能多线程环境下的内存管理优化方案 【免费下载链接】mimalloc mimalloc is a compact general purpose allocator with excellent performance. 项目地址: https://gitcode.com/GitHub_Trending/mi/mimalloc C/C开发者在构建…...
【职场】职场“贵人“的真相:他们从不随机出现,也从不无缘无故消失
职场"贵人"的真相:他们从不随机出现,也从不无缘无故消失每个在职场里走得还不错的人,回头看,都能说出一两个名字。 那个在你最迷茫的时候,把你带进了某个重要的圈子;那个在关键会议上,…...
DH1766电源短路测试避坑指南:为什么你的保险丝熔断时间和想象的不一样?
DH1766电源短路测试中的保险丝熔断现象深度解析 在电子工程实验室中,可编程电源的短路测试是验证电路保护器件性能的常规操作。然而,当使用DH1766这类高精度电源进行测试时,许多工程师都会遇到一个令人困惑的现象:保险丝的实际熔断…...
基于以太网转换器的工业交换机接入方案提升数据传输效率与稳定性
一、项目背景 某中型自动化生产企业现有3条生产线,核心控制设备采用10套西门子S7-200 SMART CPU SR40 PLC,负责生产线配料、输送、检测等全流程控制。随着企业数字化升级推进,需实现PLC与上位机、触摸屏的数据实时交互,接入工厂简…...
基于SSM的在线预约导游系统(10068)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
LDDC歌词工具:5分钟掌握专业级歌词下载与格式转换完整指南
LDDC歌词工具:5分钟掌握专业级歌词下载与格式转换完整指南 【免费下载链接】LDDC 简单易用的精准歌词(逐字歌词/卡拉OK歌词)下载匹配工具|A simple and user-friendly tool for downloading and matching precise lyrics (word-by-word lyrics/Karaoke lyrics) 项…...
COMSOL电磁超声仿真避坑指南:从‘域不适用’报错到结果收敛的完整调试流程
COMSOL电磁超声仿真避坑指南:从‘域不适用’报错到结果收敛的完整调试流程 电磁超声仿真作为多物理场耦合的典型应用场景,其复杂性往往让即使有一定COMSOL基础的用户也频频"踩坑"。当你在深夜盯着屏幕上鲜红的"域不适用"报错&#x…...
TVBOX最新电视直播软件tv版下载与安装教程
如何安装最新版电视直播软件tv版TVBOX?先讲清楚:TVBox 是开源播放器,本身不带影视资源,装好后必须配置 “数据源 / 接口” 才能用。下面分「下载 → 安装 → 配置 → 常见问题」一步步来。(如果不会配置,可…...
