002 仿muduo库实现高性能服务器组件_整体框架
🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
🌹关注我💪🏻带你学更多知识
文章目录
- 前言
- 项目框架
- 小结
前言
本文不会包含任何项目模块的代码,旨在向你介绍项目具体分为哪几个模块,考虑到还没有涉及任何模块的学习,因此本文主要是为了让你写此项目的时候有一个初步印象,所以本文也不会涉及对各个模块深度剖析
项目框架
功能模块划分:
基于以上的理解,我们要实现的是⼀个带有协议⽀持的Reactor模型⾼性能服务器,因此将整个项⽬的
实现划分为两个⼤的模块:
• SERVER模块:实现Reactor模型的TCP服务器;
• 协议模块:对当前的Reactor模型服务器提供应⽤层协议⽀持
SERVER模块:
SERVER模块就是对所有的连接以及线程进⾏管理,让它们各司其职,在合适的时候做合适的事,最终
完成⾼性能服务器组件的实现。
⽽具体的管理也分为三个⽅⾯:
• 监听连接管理:对监听连接进⾏管理。
• 通信连接管理:对通信连接进⾏管理。
• 超时连接管理:对超时连接进⾏管理。
基于以上的管理思想,将这个模块进⾏细致的划分⼜可以划分为以下多个⼦模块:
1、Buffer模块:
Buffer模块是⼀个缓冲区模块,⽤于实现通信中⽤⼾态的接收缓冲区和发送缓冲区功能
2、Socket模块:
Socket模块是对套接字操作封装的⼀个模块,使得对于套接字的各项操作更加简便
3、 Channel模块:
Channel模块是对⼀个描述符进行监控事件管理,实现对描述符可读,可写,错误…事件的管理操作,以及Poller模块对描述符进⾏IO事件监控就绪后,根据不同的事件,回调不同的处理函数功能。
4、Connection模块
Connection模块是对Buffer模块,Socket模块,Channel模块的⼀个整体封装,实现了对⼀个通信套接字的整体的管理,每⼀个进⾏数据通信的套接字(也就是accept获取到的新连接)都会使⽤Connection进⾏管理。
5、Acceptor模块:
Acceptor模块是对Socket模块,Channel模块的⼀个整体封装,实现了对⼀个监听套接字的整体的管
理。
6、 TimerQueue模块:
TimerQueue模块是实现固定时间定时任务的模块,可以理解就是要给定时任务管理器,向定时任务管理器中添加⼀个任务,任务将在固定时间后被执⾏,同时也可以通过刷新定时任务来延迟任务的执⾏。
7、Poller模块:
Poller模块是对epoll进⾏封装的⼀个模块,主要实现epoll的IO事件添加,修改,移除,获取活跃连接功能
8、 EventLoop模块:
EventLoop模块可以理解就是我们上边所说的Reactor模块,它是对Poller模块,TimerQueue模块,Socket模块的⼀个整体封装,进⾏所有描述符的事件监控。
9、 TcpServer模块:
这个模块是⼀个整体Tcp服务器模块的封装,内部封装了Acceptor模块,线程池EventLoopThreadPool模块。
HTTP协议模块:
HTTP协议模块⽤于对⾼并发服务器模块进⾏协议⽀持,基于提供的协议⽀持能够更⽅便的完成指定协议服务器的搭建。
1、 Util模块:
这个模块是⼀个⼯具模块,主要提供HTTP协议模块所⽤到的⼀些⼯具函数,⽐如url编解码,⽂件读写…等。
2、 HttpRequest模块:
这个模块是HTTP请求数据模块,⽤于保存HTTP请求数据被解析后的各项请求元素信息。
3、 HttpResponse模块:
这个模块是HTTP响应数据模块,⽤于业务处理后设置并保存HTTP响应数据的的各项元素信息,最终会被按照HTTP协议响应格式组织成为响应信息发送给客⼾端。
4、 HttpContext模块:
这个模块是⼀个HTTP请求接收的上下⽂模块,主要是为了防⽌在⼀次接收的数据中,不是⼀个完整的HTTP请求,则解析过程并未完成,⽆法进⾏完整的请求处理,需要在下次接收到新数据后继续根据上下⽂进⾏解析,最终得到⼀个HttpRequest请求信息对象,因此在请求数据的接收以及解析部分需要⼀
个上下⽂来进⾏控制接收和处理节奏
5、 HttpServer模块:
这个模块是最终给组件使⽤者提供的HTTP服务器模块了,⽤于以简单的接⼝实现HTTP服务器的搭建。
HttpServer模块内部包含有⼀个TcpServer对象:TcpServer对象实现服务器的搭建
HttpServer模块内部包含有两个提供给TcpServer对象的接⼝:连接建⽴成功设置上下⽂接⼝,数据处理接⼝。
HttpServer模块内部包含有⼀个hash-map表存储请求与处理函数的映射表:组件使⽤者向HttpServer设置哪些请求应该使⽤哪些函数进⾏处理,等TcpServer收到对应的请求就会使⽤对应的函数进⾏处理。
小结
项目的模块比较多且复杂,希望看此文的你能够将注意力先放在一个模块上,然后逐个攻破,后续我将会出一篇将所有模块联系在一起的文章
相关文章:

002 仿muduo库实现高性能服务器组件_整体框架
🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 🌹关注我💪🏻带你学更多知识 文章目录 前言项目框架小结 前言 本文不会包含任何项目模块的代码,旨在向你介绍项目具体分为哪几个模块&am…...

车道线识别与预警系统LDWS(代码+教程)
车道线识别与预警系统(Lane Departure Warning System, LDWS)作为智能交通系统中的重要组成部分,旨在通过先进的图像处理和计算机视觉技术,实时监测车辆行驶过程中的车道位置,预防因驾驶员疏忽或疲劳导致的车道偏离事故…...
Python基础学习笔记(七)——元组
目录 一、一维元组的介绍、创建与修改二、组合的基本操作1. 遍历2. 取长度3. 取最值4. 打包5. 批处理5.1 map()函数5.2 lambda 表达式5.3 lambda 表达式 map()函数 一、一维元组的介绍、创建与修改 元组(tuple),一种不可变、有序、可重复的数…...

安卓开发:相机水印设置
1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…...
Excel工作表单元格单击选中事件,VBA动态数值排序
Excel工作表单元格单击选中事件,VBA动态数值排序(WX公众号:Excel潘谆白说VBA) 文章目录 前言一、运行效果二、代码前言 面对每月的消费账单,面对月底待还的信用卡或花呗,面对不足三位数的余额,你是否怀疑过账单自己的消费。你是否因此开始记账,每个月记流水,想知道当月…...

数据结构~~链式二叉树
目录 一、基本概念 链式存储概念 二、链式二叉树的结构 链式二叉树结构 构建链式二叉树 二叉树的遍历 二叉树节点和高度等 二叉树销毁 三、链式二叉树的练习 相同的树 对称二叉树 另外一颗子树 二叉树前序遍历 二叉树遍历 四、完整代码 Tree.h Tree.c 五、总结 一…...

线程池,日志
所要用到的知识点: 多线程的创建 生产消费模型, 线程锁 条件变量 代码: 线程池日志...
vue的图片上传
关于vue3的图片上传,这里记录一下,有兴趣的朋友可以参考。。。。 <van-uploader:after-read"afterRead"v-model"headImg":max-count"1"class"picture"/> const fileList ref();const afterRead (fil…...
题解 P1150
题解 P1150 因为k个烟蒂1根烟1个烟蒂 所以k-1个烟蒂1根烟 注意减掉最后一根烟的烟蒂 (因这题并没有借烟蒂换烟再还回这一说) 此解法为小学4~6年级水平 #include <bits/stdc.h>using namespace std;int main(){int n,k;cin>>n>>k;cout<<n(n-1)/(k-…...

牛客NC324 下一个更大的数(三)【中等 双指针 Java/Go/PHP/C++】参考lintcode 52 · 下一个排列
题目 题目链接: https://www.nowcoder.com/practice/475da0d4e37a481bacf9a09b5a059199 思路 第一步:获取数字上每一个数,组成数组arr 第二步:利用“下一个排列” 问题解题方法来继续作答,步骤:利用lintc…...

Vue3解决“找不到模块“@/components/xxx.vue”或其相应的类型声明”
文章目录 前言背景问题描述解决方案总结 前言 在使用 Vue 3 开发项目时,遇到“找不到模块 ‘/components/xxx.vue’ 或其相应的类型声明”的错误是一个常见问题。这通常与 TypeScript 和模块解析相关的配置不当有关。本文将详细介绍如何解决此问题,确保…...
nginx的Connection refused
问题描述 nginx的错误日志中突然出现大量的的Connection refused问题,日志如下: 2020/03/19 09:52:53 [error] 20117#20117: *7403411764 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server:…...
Haskell 的高阶函数(Higher-order functions)
本节继续介绍Haskell的知识,本节内容介绍的是高阶函数(Higher-order functions)的概念和应用。高阶函数是指能够接受其他函数作为参数,或者返回函数作为结果的函数。 Functions as values(函数作为值)&…...
Unity websocket客户端
🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎目标:服务器和客户端可以实时的传输信息 ☀️实现目标: 使用的w…...

每日一题——博弈论(枚举与暴力)
博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…...

pytorch笔记:torch.nn.Flatten()
1 介绍 torch.nn.Flatten(start_dim1, end_dim-1) 将一个连续的维度范围扁平化为一个张量 start_dim (int)要开始扁平化的第一个维度(默认值 1)end_dim (int)要结束扁平化的最后一个维度(默认值 -1) 2 举例 input torch.ra…...

一个人应该怎么操作抖音小店呢?店铺操作流程给你讲解清楚!
大家好,我是电商小V 现在入驻抖音小店的有很多新手,新手最关心的就是一个人应该如何操作抖音小店,操作抖音小店需要做好哪几步呢?关于这个问题咱们就来详细的讲解一下, 第一点:开店 开店是做店的第一步&…...

“等保测评与安全运维的协同:保障企业网络安宁
"等保测评与安全运维的协同:保障企业网络安宁"是一个涉及信息安全领域的重要话题。这里,我们可以从几个方面来探讨这个主题。 1. 等保测评(等级保护测评) 等保测评,即信息安全等级保护测评,是依…...

python抽取pdf中的参考文献
想将一份 pdf 论文中的所有参考文献都提取出来,去掉不必要的换行,放入一个 text 文件,方便复制。其引用是 ieee 格式的,形如: 想要只在引用序号(如 [3])前换行,其它换行都去掉&…...

Java进阶学习笔记21——泛型概念、泛型类、泛型接口
泛型: 定义类、接口、方法的时候,同时声明了一个或者多个类型变量(如: <E>),称之为泛型类、泛型接口、泛型方法,我们统称之为泛型。 说明这是一个泛型类。 如果不使用泛型,我们可以往ArrayList中传…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...