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收到对应的请求就会使⽤对应的函数进⾏处理。

小结

项目的模块比较多且复杂,希望看此文的你能够将注意力先放在一个模块上,然后逐个攻破,后续我将会出一篇将所有模块联系在一起的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAM 与 ROM

RAM (Random Access Memory) 定义:随机访问内存(RAM)是一种可以随机访问的存储设备,意味着可以在几乎相同的时间内访问存储数据的任何位置。它是一种易失性内存,意味着一旦断电,存储在其中的数据就会丢失。…

作用域插槽和具名插槽

在 Vue 2 中,具名插槽和作用域插槽是组件模板中非常强大的内容分发 API。它们允许开发者创建具有更复杂内容结构的组件,同时保持组件模板的清晰和可维护性。 具名插槽(Named Slots) 具名插槽允许你为插槽指定一个名字&#xff0…

从0开始学统计-如何计算总体均值的置信区间

1.什么是抽样误差? 抽样误差是统计学中一个重要概念,它指的是由于从总体中抽取样本而导致的样本统计量与总体参数之间的差异。简而言之,抽样误差是由于从总体中选取的样本并不能完全代表整个总体而引起的误差。 抽样误差的大小取决于多个因…

VBA技术资料MF157:创建每个标题的目录

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

mysql8忘记密码重置密码和创建新用户

mysql8忘记密码 查询进程 ps -ef |grep mysql杀死进程 kill -9 [进程id] 或 systemctl stop mysqld 跳过权限 启动 /usr/local/mysql/bin/mysqld --skip-grant-tables --port13306 --socket/usr/local/mysql/socket/mysql13306.sock & 另起会话登录 执行 mysql -u root --…

上位机图像处理和嵌入式模块部署(f103 mcu和Qt上位机联动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 之前我们写过一篇文章​​​​​​​,上面说的是如何利用串口对mcu进行控制,即如果利用串口实现mcu led灯的点亮和熄灭。输…

文件有内容,ls -l察看大小为0,使用cat

同事让吾在文件加点内容,以察看崩溃。吾将内容使用echo到文件,然后使用ls -l察看,竟然为0。这不科学啊。 同事建议改用cat,就能看到内容。 这应该是bug

物联网通信模组功能

物联网通信模组的主要功能和技术特性包括: 数据传输:物联网通信模组能够实现高效可靠的数据传输,这包括上传传感器数据、接收远程指令等。它支持各种数据传输协议,如MQTT、CoAP、HTTP等,这些协议使得模组能够在不同的物…

Yolov8训练自己的数据集(脱离ultralytics库)

最近在整理关于yolov8的相关内容,有个很大的问题,抛开yolov8性能不谈,yolov8代码的使用灵活性不如yolov5,尤其是对于一些新手或者对yolo框架不是很熟悉的人(这也是因人而异,有些人可能会喜欢v8代码的使用方式)。比如在…

(4)医疗图像处理:MRI磁共振成像-成像技术--(杨正汉)

目录 一、特殊成像技术 1.水成像技术 2.化学位移成像技术 二、成像辅助技术 1.脂肪抑制技术 2.磁化转移技术 3.流动补偿技术 4.空间饱和空间标记技术 5.生理门控及导航回波技术 所有的这些技术最终就是为了使得K空间通过傅里叶变化之后得到的图片变的更为清晰。 一、…

redis6.2.7安装

1、下载上传到服务器 从官下载redis,地址 https://redis.io/download/#redis-downloads 然后上传到服务器目录 app/apps目录下 2、安装gcc编译器 使用gcc --version命令测试是否已经安装了gcc编译环境,如果没有安装执行以下命令安装 yum install -y …

基于springboot+vue+Mysql的休闲娱乐代理售票系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

jupyter移除添加R内核

jupyter移除 R 内核 Jupyter Notebook 是一个开源Web应用程序,允许创建和共享包含实时代码、方程、可视化和文本的文档。这些文档被称作 "笔记本 ",可以用 Python 编写,并且可以直接运行代码。 如果你想在 Jupyter Notebook 中移…

【技术实操】银河高级服务器操作系统实例分享,TCP长连接与短连接详细说明

1.服务器环境以及配置 物理机/虚拟机/云/容器 物理机 处理器: HUAWEI Kunpeng 920 具体操作系统版本 Kylin-Server-10-SP1-Release-Build20-20210518- aarch64 内核版本 kernel-4.19.90-23.8.v2101.ky10.aarch64 2.问题现象描述 对TCP长连接有疑问 1、如何…

兴业证券 | 哪些行业在提价?

一方面, 部分行业年初以来PPI价格整体上涨,4月进一步提价;另一方面,部分行业年初以来PPI价格整体下跌或者涨幅不高,但4月开始出现边际提升。 前言:年初以来,“提价”是一条重要的投资线索。我们…

Unity Assembly Definition Dotween 引用

原理: 具体Unity程序集原理用法,暂时留坑,不介绍了,相信有很多人也写过了 这里简单放个官方API链接 https://docs.unity3d.com/cn/current/Manual/ScriptCompilationAssemblyDefinitionFiles.html 现象 :Dotween引用…

使OpenCV可以读取中文路径图片的方法

一.问题复现 1.代码 #! /usr/bin/env python # -*- coding: utf-8 -*-# File: show_img.pyimport cv2# 读取图片 img cv2.imread("车牌素材/冀A.png")# 显示图片 cv2.imshow("img", img) cv2.waitKey(0)2.报错截图 3.报错内容 [ WARN:00.05…

力扣题解记录

三元组队列、取出元组中的元素:腐烂的橘子

ISCC——AI

得到一个T4.pyc 回编译一下 得到下面代码 import base64def encrypt_and_compare(user_input, offset_str, target_base64):if len(user_input) ! 24:return Please enter a string with a length of 24encrypted Nonefor i, char in enumerate(user_input):offset int(off…

axios的配置项及含义

axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。它有许多配置项可以自定义 HTTP 请求。以下列举 axios 中的五个常用配置项及其含义,并提供示例代码: 1. method 含义:指定请求方法(例如 GET, POST,…