当前位置: 首页 > 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;并且每座岛屿只能由水平…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...