当前位置: 首页 > news >正文

仿muduo库的Tcp服务器以及其应用层Http协议支持

项目成果:一份Tcp服务器和一份封装这个Tcp服务器建的HTTP服务器

仿muduo服务器: 仿muduo库高并发服务器+实现TCP的HTTP-serverhttps://gitee.com/zhu-chaochao/imitation-muduo-server

目录

具体模块和功能:

TimeWheel模块:

Any模块:

Buffer模块:

日志宏:

Socket模块:

Acceptor模块:

Channel模块:

Poller模块:

EventLoop模块:

LoopThread模块:

LoopThreadPool模块:

Connection模块:

TcpServer:

使用方法:

HttpServer:

Util模块:

HttpContext模块:

HttpServer:

使用方法:

性能测试:


设计理念:

这是一个One Thread One Loop 式主从Reactor的模型的高并发服务器

主Reactor处理新连接请求,有连接分发到子Reactor中,子Reactor中进行客户端通信,处理业务,有事件触发就分配到子线程的EventLoop去执行。

具体模块和功能:

TimeWheel模块:

原理/设计——(TimeWheel自定义类,内部使用TimerTask自定义类,当销毁的时候,通过析构函数调用设置的定时任务),定时器依靠linux里提供的timefd定时器(读取定时器文件描述符任务添加到使用线程的EventLoop自定义类实例),这个读取timerfd其实也依靠Channel自定义类去设置读取任务,管理——总之这个时间轮不单独使用,结合到EventLoop去处理更多样异步任务。ps-1(EventLoop自定义类的异步任务:定时任务,网络请求)ps-2 xxx自定义类——指的是xxx是自定义类不是c++或者Linux有的,而是做这个项目实现的,个别可能没添加纯属没看到/前面写了后面没想写

Any模块:

为了支持更多的应用层协议,Connection自定义类(要放Buffer自定义类)中要用到它来保存不同数据结构,c++17里有提供的any类,这里自己实现(并不复杂,了解思想,手动实现)。

原理:Any类里面有一父类,一子类,父类占位,子类实际存值,通过先存父类指针不给实际类型,延迟子类存的变量类型的时间,直都确定的类型T传进来才实际开辟空间记录指针。

Buffer模块:

对vector封装实现,没啥好说的。

日志宏:

简单实现版,方便dbug。

Socket模块:

对Linux下TCP通信函数的封装,简化操作。

Acceptor模块:

对Socket模块封装,+Channel模块实例管理新客户端连接到来,+主Reactor线程的EventLoop指针,把获取新连接然后要调的callback操作丢给EventLoop处理 。

Channel模块:

包装了一个fd和它的监控事件及对应callback。

对fd ,epoll事件机制->Channel::HandleEvent()->判断分发给五种事件->下一级callback。

Poller模块:

对epoll相关函数的封装,一个实例就能管理大量的Channel,EventLoop存了一个实例来处理活跃事件。

传进去的channel进入Poller模块存储并被赋值给epoll的 struct epoll_event结构里(存的是要监控的fd和由channel整理的要监控的事件)。

EventLoop模块:

对Poller模块进行包装,整合定时器模块的同时做了任务队列,互斥锁处理线程安全问题,epoll堵塞不运行任务队列,是依靠外部每有任务进来就有一个“假的”事件就绪,epoll就不堵了。

LoopThread模块:

包装EventLoop和thread, 确认安全(互斥锁和条件变量来在实例化完EventLoop的时候才能使用LoopThread::GetLoop()成员函数)的同时,在线程入口函数里调用EventLoop的Start()函数。

LoopThreadPool模块:

如类名,

Connection模块:

管理newfd,通信新连接,和设置的callback,拿到的是分配好的_conn_id,上层管理Connection实例,也做定时器的唯一ID进行管理,
拿到的是newfd,包装了Buffer模块,去实现对newfd的读写到缓冲区再调用上层给的。

TcpServer:

传进来开放的端口号,包装了一个EventLoop实例,以指针形式管理了所有的Connection对象

线程池,一个Acceptor实例来监听,把一系列callback继续向上层提供设置函数。

使用方法:

TcpServer:向外提供了回调函数的设置,线程数量的设置,Start函数,启动服务器,非活跃销毁设置,设置完后,再调用Start函数,一个One Thread One Loop 式主从Reactor的模型的高并发服务器就运行成功了。

HttpServer:
Util模块:

Http应用层协议会用到的一些URl编码,解码,判断文件类型,字符串分割,读写等的函数的集合

HttpRequest模块,保存请求信息的模块
HttpResponse模块,保存相应信息的模块

HttpContext模块:

解析请求信息,按HTTP 协议规范分阶段解析客户端发来的 HTTP 请求数据,管理解析状态,并存储解析后的请求信息

HttpServer:

封装TcpServer,向外提供callback设置,内部有Route函数路由分发,去调用对应的callback

使用方法:

设置端口,设置线程池线程数量,设置静态资源根目录,设置Get,Post,Put,Delete对应callback,然后启动服务器

性能测试:

明天再补图和测试结果

http://www.jsqmd.com/news/508691/

相关文章:

  • Qwen3-32B-Chat效果对比:不同batch_size下RTX4090D吞吐量与延迟变化曲线
  • VCAM不负众望,闪耀东莞一步步研讨会! - 品牌企业推荐师(官方)
  • 【BKA回归预测】黑翅鸢算法BKA-CNN-LSTM、CNN-LSTM、LSTM、CNN四模型多变量回归预测(多输入单输出)【含Matlab源码 15200期】
  • 【异常】OpenClaw 飞书插件安装失败Failed to install plugin from npm. Error: Command failed: openclaw plugins inst
  • 品质为先、服务至上,VCAM闪耀西安——SbSTC●一步步新技术研讨会●西安 - 品牌企业推荐师(官方)
  • GPS定位数据解析:从NMEA到实际坐标(5/10)
  • 2025_NIPS_SATURN: SAT-based Reinforcement Learning to Unleash Language Model Reasoning
  • Android用户必看:如何识别并防范CRaxsRat v7.4这类远程控制木马
  • 亲测有效:2026年教育机构代理招生平台分享 - 企业推荐官【官方】
  • 解锁3大高效技能:专业级网页资源捕获完全指南
  • Pi0视觉语言动作模型快速上手:从安装到运行完整教程
  • System V IPC底层原理详解
  • S7通信随笔
  • 一键调用GLM-4.7-Flash API:Ollama部署后的进阶使用教程
  • 从智能卡到物联网:一文读懂GPC-SCP03安全通道协议在JavaCard™密钥管理中的实战应用
  • Qwen3.5-9B强化学习泛化能力落地:百万级任务适配部署步骤详解
  • yz-女生-角色扮演-造相Z-Turbo生成效果优化:提示词工程指南
  • 告别繁琐安装!m3u8live.cn 在线M3U8播放器,粘贴即播超省心
  • 辽阳市鼎盛模具厂. - 企业推荐官【官方】
  • Qwen3-32B-Chat RTX4090D部署案例:科研论文润色助手私有化部署
  • 基于SDPose-Wholebody的Python爬虫数据可视化分析
  • CTLA-4抗体如何重塑肿瘤免疫治疗格局?
  • Qt文件操作全解析:QFile vs QDataStream vs QTextStream如何选择?
  • 文墨共鸣应用案例:某重点中学语文教研组‘作文互评AI助手’落地过程全记录
  • Windows下用CDO处理CMIP6气象数据的完整避坑指南(附批量裁剪脚本)
  • Z-Image-Turbo-rinaiqiao-huiyewunv部署案例:校园动漫社本地AI绘图工作站搭建实录
  • 【行测】常识知识-近代史1(1840-启)
  • 江西土特产哪家强?亲测这家靠谱 - 企业推荐官【官方】
  • 思通AI视频监控系统开源版深度解析:5分钟部署,20个免费模型,开启智能监控新纪元
  • Qwen3.5-9B开源大模型效果展示:百万RLHF强化学习泛化能力案例集