010 仿muduo实现高性能服务器组件_Http协议模块

news2024/11/16 2:21:38

​🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
📒代码仓库: 项目代码
🌹关注我💪🏻带你学更多知识

文章目录

  • 前言
  • Util模块
    • 设计意义
    • 整体设计
    • 代码如下
  • HttpRequest模块
    • 代码如下
  • HttpResponse模块
    • 代码如下
  • HttpReqCtx模块
    • 代码如下
  • HttpServer模块
    • 代码如下
  • 项目整体分析流程
  • 小结

前言

HTTP协议模块⽤于对⾼并发服务器模块进⾏协议⽀持,基于提供的协议⽀持能够更⽅便的完成指定协议服务器的搭建

Util模块

设计意义

该模块提供一些功能性接口,用于更好地解析和处理HTTP格式数据的请求行,请求报头,以及文件操作,获取文件类型等

整体设计

URL中,我们的一个资源路径和我们的查询字符串里面可能会有 一些特殊字符,这些特殊字符又会跟我们的url中的特殊字符产生一些 歧义,如果有特殊字符就需要url编码,传递给对方就需要解码 通过HTTP状态码获取描述信息 通过后缀名获取mime,这个mime就是客户端请求的资源型文件,资源型 文件是怎么样的格式,比如html,jpg

在这里插入图片描述

代码如下

在这里插入图片描述

在这里插入图片描述

HttpRequest模块

HttpRequest模块与HttpResponse模块模块的设计功能是相似的,为了更好的进行数据解析以及数据的发送,如果你要对数据解析,则需要把数据读取出来,然后将读取的数据构造出一个完整的HTTP格式的请求对象,通过对请求的业务逻辑处理,同时构建出一个完整的HTTP格式的响应对象,最后将响应对象序列化之后发送回对方 在数据解析处理以及返回的过程中会涉及到HTTP格式的请求和相应的处理,所以我们需要这两个类分别构造出HTTP格式的请求和响应对象,方便我们处理数据

请求报文的构成
在这里插入图片描述
在这里插入图片描述
解析其实就是从缓冲区取出一行行数据,然后根据分隔符或条件将一行数据划分填充到HttpRequest中的_method(请求方法) _path(资源路径) _version(协议版本) _body(请求正文) _matches(资源路径的正则提取数据) _headers(头部字段) _params(查询字符串)字段中

代码如下

在这里插入图片描述

HttpResponse模块

跟HttpRequest模块的设计类似,这里不再过多赘述
响应报文的构成
在这里插入图片描述
在这里插入图片描述

代码如下

在这里插入图片描述

HttpReqCtx模块

该模块是⼀个HTTP请求接收的上下⽂模块,主要是为了防⽌在⼀次接收的数据中,不是⼀个完整的HTTP请求,则解析过程并未完成,⽆法进⾏完整的请求处理,需要在下次接收到新数据后继续根据上下⽂进⾏解析,最终得到⼀个HttpRequest请求信息对象,因此在请求数据的接收以及解析部分需要⼀个上下⽂来进⾏控制接收和处理节奏。
在这里插入图片描述

代码如下

在这里插入图片描述

HttpServer模块

关于HttpServer模块的分析也放到项目整体分析流程中了,这里不再多赘述
在这里插入图片描述

代码如下

在这里插入图片描述

项目整体分析流程

还有些细节需要看server模块分析流程,建议先看完上一篇中的流程分析戳此跳转

具体流程:该项目要实现的是主从reactor 模型服务器,当主reactor 线程获取到新连接后将新连接分发给从属reactor 线程,从属reactor 线程启动可读事件监控,等待客户端发送数据,当执行可读事件回调时会将 socket 中的数据放入到接收缓冲区当中,当接收缓冲区中的数据大于0时,执行处理缓冲区数据的回调,即从接收缓冲区中取出一行行数据并分割填充到 HttpRequest 中对应要素中,接着进行业务处理,看看是对静态资源的请求处理还是功能性请求处理,最后将 HttpResponse,进行组织,然后将 HttpRespons、中数据放入到发送缓冲区当中并启动写事件监控,执行可写事件的回调将发送缓冲区的数据进行发送给客户端,发送完毕后释放连接
在这里插入图片描述

小结

该项目就到此结束啦,如果你存在疑问,欢迎在评论区中留言呀

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

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

相关文章

初始K8s

K8S 基本概念: K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。 作用: 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成…

web自动化6-pytest③实践测试用例-回归用例web自动化

# -*- coding: utf-8 -*- """ lemut_select - 业务受理 Author: duxiaowei Date: 2024/7/17 """ import timeimport allure import pytest from selenium.webdriver.common.by import By# 业务受理 allure.feature("业务受理") class …

SQL Date Functions | SQL Time Functions 概述

SQL Date Functions | SQL Time Functions 在SQL中,日期和时间函数是用于处理日期和时间数据的重要工具。 SQL Date Functions | SQL Time Functions函数可以从日期时间数据中提取特定的部分、执行日期计算、格式化日期时间等操作。 No.FunctionDescription描述1…

sql注入详解【从数据库架构分析】

文章目录 简介数据库的架构sql注入概念正常语句正常回显页面在页面中使用sql语句 跨库查询sql文件读写影响条件复现读写的路径的问题 sql注入请求分类sql注入请求类型sql注入请求方式:sql注入数据请求格式 数据库的增删改查数据库查询数据库添加数据库删除数据库修改…

【TS】TypeScript中的接口(Interface):对象类型的强大工具

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript中的接口(Interface):对象类型的强大工具引言1. 接口的基本概念1.1 什…

MybatisPlus核心用法

MybatisPlus核心用法 目录 MybatisPlus核心用法1.使用MybatisPlus的基本步骤:2.MybatisPlus是如何获取实现CRUD的数据库表信息的?3.MybatisPlus的常用注解有哪些?如果表名称和实体类名称不符合约定该怎么做?IdType的常见类型有哪些…

IOS微软语音转文本,lame压缩音频

在IOS开发中,用微软进行语音转文本操作,并将录音文件压缩后返回 项目中遇到了利用微软SDK进行实时录音转文本操作,如果操作失败,那么就利用原始音频文件通过网络请求操作,最终这份文件上传到阿里云保存,考…

监控服务器状态,夜莺( nightingale)方案介绍

前提 选择一台服务器,部署一个监控服务端,然后在各个windows或者linux中部署数据采集节点。 类似如下结构 目前我这边采用的技术是 https://flashcat.cloud/product/nightingale/ Nightingale 的解决方案 1 部署内容 服务端(服务端为 c…

centos7安装思源黑体

centos7安装思源黑体 下载思源字体centos7查看目前字体查看所有字体查看所有中文字体 进入字体目录将新加的字体目录添加到fonts.conf配置文件刷新字体缓存查看效果 下载思源字体 下载地址: https://github.com/adobe-fonts/source-han-sans/releases centos7查看目前字体 查…

【MyBatis】基础操作

准备工作 准备数据库表创建 springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)application.properties中引入数据库连接信息创建对应的实体类 Emp(实体类属性采用驼峰命名)准备Mapper接口 EmpMappe…

排序系列 之 希尔排序

!!!排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort,又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组,然后按照每组使用直接插入排序&#…

idea一直update indexing 卡死

打开IDEA存储应用程序的本地数据文件夹,关闭IDEA,删除caches和index文件夹下的文件,重新打开。

数据加密技术在数据安全中起到什么样的作用?

把数据以及一个密钥,通过相关的加密算法,进行一系列的加密算法计算处理,使这个数据变成密文,保护数据的机密性。数据加密技术是一种将原始数据(明文)通过算法转换成只有授权用户才能解读的格式(…

C++客户端Qt开发——系统相关(多媒体音频)

3.多媒体(音频、视频) 播放声音需要引入multimedia模块 使用QSound类 仅支持的音频文件格式为.wav,同样使用qrc文件管理外部的资源 (使用的.wav文件不宜过大,尽量在几秒内,否则会构建时间过长&#xff…

拓维思树障分析Tovos PowerLine 4.0.19 航线规划Tovos SmartPlan 2.0.0 下载License电力应用软件使用

Tovos PowerLine 是功能强大的输电线路智能巡检系统!这是一个专业且智能的软件,能够更准确的进行巡检和对线路设备进行精确的测量,通过获取高精度的点云来获取精准的三维路线的地形地貌、设备设施、途径的各种物体等来精确您的三维空间信息和…

三子棋小程序

一.自定义头文件(game.h) 放入源文件需要用到的标准库头文件和函数的声明 ROW 和COL为棋盘的行和列&#xff0c;三子棋嘛&#xff0c;肯定为3啦 #pragma once #include<stdio.h> #include<String.h> #include<stdlib.h> #include<time.h> #define ROW…

中国少女徐可昕心怀爱豆梦 为实现梦想勇赴韩国

如今MZ世代(MZ世代是‌Millennial世代和‌Z世代的合成词,用来描述1980至2000年间出生的人)小伙伴们追求着怎样的梦想呢?随着韩国K-POP热潮和娱乐产业的发展,越来越多的年轻人希望可以在娱乐圈工作,例如成为爱豆或经理人。通过抖音或YouTube等,可以发现很多才华横溢的年轻人创作…

malloc 对比验证 posix_memalign 的功能

1&#xff0c;函数说明 posix_memalign 是一个 POSIX 标准定义的函数&#xff0c;用于在内存中分配对齐的内存块。这个函数可以确保分配的内存块满足特定的对齐要求&#xff0c;通常用于需要对齐内存访问的情况&#xff0c;比如 SIMD 指令集的使用或者特定硬件要求的内存对齐。…

瑞派明星医生:技术深耕教学指导,燃动当代名校兽医双效技能Buff

名校精进&#xff0c;攻破技术堡垒 从动物保护、环境保护的最初理想&#xff0c;到兽医学专业领域深耕&#xff0c;天津瑞派长江宠物医院的唐玉洁医生正用自己的实际行动展现着当代兽医人才背后的奉献、良知、超越与传承。 享受了东北林业大学带来的短暂而有趣的大学生活&…