很多人写过 TCP 回显服务器,也能把 epoll 的三件套(create、ctl、wait)背下来,但一旦要求「支持 HTTP GET/POST、能发静态文件、能列出目录、还要跑满多核」,代码就散成一团:fd 到处传,回调里套回调,线程一多就锁不住。这门课针对的就是这个断层——它不讲怎么用现成框架起服务,而是带你把 Reactor 多反应堆模型从零写出来,再用 C++ 重写一遍。
先确认你缺的是哪一块
- 能写单线程阻塞 socket,但没处理过「一个线程管上万连接」的非阻塞状态机。
- 知道 epoll 是 IO 多路复用,但说不清 ET 和 LT 在读写循环里的实际差别,以及什么时候必须一次读到 EAGAIN。
- 写过多线程,但没做过「主线程 accept、子线程各自跑 EventLoop」这种 one loop per thread 的分工。
- HTTP 只调过库,没自己解析过请求行、头部字段,也没想过大文件为什么用 sendfile 而不是 read+write。
如果上面有一半以上中了,这门课的顺序对你就是合适的;如果连 socket 阻塞/非阻塞切换都没写过,建议先补这一层再进来,否则第一阶段会跟得吃力。
课程实际在做什么
第一阶段是搭雏形:用 epoll 把监听、接受连接、收数据、解析请求串起来,做出一个能通过浏览器访问的静态文件与目录服务,支持 GET 和 POST,发文件时走 sendfile 零拷贝,目录请求返回列表。这里会专门处理非阻塞读写和基础多线程,把「能跑」和「跑得住」的区别摆出来。
第二阶段是拆模块。这一步才是 Reactor 的正题:把回调从主循环里剥出来,抽象出 Channel 负责 fd 与事件的绑定,ChannelMap 管理 fd 到 Channel 的映射,Dispatcher 决定事件分发给谁,EventLoop 承载单个线程的循环,线程池负责把新连接派到从属 loop 上。Buffer 单独管读写缓冲,TcpServer / TcpConnection 把连接的生命周期和回调封装起来,HTTP 解析单独成层。拆完之后,原本一坨的 main 会变成可替换、可单测的结构。
第三阶段用 C++ 重构整条链路。这遍重写不是翻译,而是借 RAII、智能指针、std::function 这些工具把资源归属和回调注册讲清楚——fd 什么时候关、Channel 什么时候从 map 里摘、连接断开后回调还可能不会被触发,这些坑都会在重写里暴露。配套的协议说明和模块脑图用来对照结构,不建议只看图不看代码。
配套练习该怎么用
每拆出一个模块,先别急着看下一节。可以按这个顺序自测:
- 把 Channel 的事件回调换成自己的打印逻辑,确认事件触发次数和顺序符合预期。
- 用压测工具(如 ab 或 wrk)打自己的服务,观察多线程下 QPS 是否随核数上升,还是被某把锁卡住。
- 手工构造畸形 HTTP 请求,看解析层是崩、是拒、还是死循环。
- 传一个大文件,抓一下系统调用,确认走的是 sendfile。
脑图和协议说明适合当索引:写完一个模块后回去对一遍,看自己漏了哪条状态迁移。
看完应该能回答的问题
- 为什么主线程只负责 accept,而不直接处理读写?派发新连接时怎么避免惊群?
- ET 模式下,读事件来了为什么必须循环读到返回 EAGAIN?漏了会怎样?
- Channel 和 fd 是什么关系?连接关闭时,ChannelMap 里的条目由谁、在什么时机删除?
- EventLoop 为什么强调「一个线程一个」,跨线程唤醒它需要什么机制?
- Buffer 的读指针和写指针各自解决什么问题,为什么不让上层直接 hold 一块 char 数组?
这些问题答不上来,说明对应模块还只是抄过一遍。答得上来,再往「多线程优化」那一层推——锁的粒度、任务队列、定时器与连接超时,都是在这套结构上继续加的东西。缺什么补什么,比从头再学一遍 TCP/IP 更省时间。
这是一套从零手写 Linux 高并发 HTTP 服务器的课,核心不是前端 React,而是 Reactor 多反应堆模型。先用 epoll 搭出可访问的静态文件 / 目录服务,再拆成 Channel、Dispatcher、EventLoop、线程池、Buffer、TcpServer / TcpConnection 和 HTTP 解析模块,最后用 C++ 重构整条链路,并配有协议说明和模块脑图。
课程推荐
《全新高并发Reactor服务器全栈开发实战 从模型设计到多线程优化完整指南》适合有 C 语言和基本 socket 基础、想把「能写 TCP 回显」升级成可上线 HTTP 服务的人。课程分三阶段:第一阶段用 epoll 雏形完成监听、连接、GET/POST 解析、sendfile 发文件和目录列表,并补上非阻塞与多线程;第二阶段按生产结构拆模块——Channel / ChannelMap、Epoll/Poll/Select Dispatcher、EventLoop 任务队列、WorkerThread / ThreadPool、应用层 Buffer、TcpServer 与 TcpConnection,再手写 HttpRequest / HttpResponse;第三阶段用 C++ 重构上述类,梳理多反应堆事件流并做编译调试。【技能收获】学完可掌握:epoll / poll / select 多路复用、主从 Reactor、EventLoop 与任务队列、线程池、应用层 Buffer、HTTP 请求解析与响应、sendfile 零拷贝、C++ 网络模块重构。配套 PDF 和 xmind 便于对照架构复盘。【学习建议】建议按 001~109 顺序:先把 001~026 的单反应堆 HTTP 跑通,再跟 027~081 把模块边界画清楚,最后 082~109 用 C++ 重构并压一轮浏览器访问测试。每完成一块就画一张「谁持有 fd、谁在哪个线程跑 loop」的图,这比只抄代码更能写进简历。【就业发展】可面向岗位:C/C++ 后端开发、高并发网络工程师、中间件 / 基础组件开发。网关、长连接和基础组件岗仍看重 epoll / Reactor 手写能力,能讲清主从反应堆、线程池和 HTTP 解析的人,比只会调框架更有面试说服力。
视频目录(109 节)
* 001. 项目概述以及要求.mp4
* 002. 项目效果展示.mp4
* 003. 关于项目业务层的说明.mp4
* 004. 多反应堆模型结构概述.mp4
* 005. 在VS中创建基于Linux的项目.mp4
* 006. 初始化服务器端用于监听的套接字.mp4
* 007. epoll 工作模型的雏形.mp4
* 008. 和客户端建立新连接.mp4
* 009. http的get请求数据块的格式.mp4
* 010. http的post请求数据块的格式.mp4
* 011. http响应消息的数据格式.mp4
* 012. http的状态码和如何指定content-type.mp4
* 013. 接收客户端的http请求消息.mp4
* 014. sscanf 函数的使用.mp4
* 015. 解析请求行.mp4
* 016. 发送文件的两种方式.mp4
* 017. **http响应的数据块头.mp4
* 018 通过http响应消息发送文件.mp4
* 019. Linux 中遍历目录的两种方式.mp4
* 020. 发送目录-上.mp4
* 021. 发送目录-下.mp4
* 022. 代码的补充和编译.mp4
* 023. 程序测试和部分bug的修改.mp4
* 024-非阻塞模式下关于sendfile函数的说明.mp4
* 025. 解决浏览器无法访问带特殊字符的文件的问题.mp4
* 026. 添加多线程处理.mp4
* 027. 第2阶段模块功能概述.mp4
* 028. Channel 模块的实现.mp4
* 029. ChannelMap 模块的实现 - 上.mp4
* 030. ChannelMap 模块的实现 - 下.mp4
* 031. Dispatcher 模块的实现思路.mp4
* 032. Dispatcher 的定义.mp4
* 033. EpollDispatcher 的实现 - 上.mp4
* 034. EpollDispatcher 的实现 - 中.mp4
* 035. EpollDispatcher 的实现 - 下.mp4
* 036. PollDispatcher 的实现 - 上.mp4
* 037. PollDispatcher 的实现 - 下.mp4
* 038. SelectDispatcher 的实现.mp4
* 039. EventLoop 模块的剖析.mp4
* 040. EventLoop 的初始化.mp4
* 041. 启动 EventLoop.mp4
* 042. 在 EVentLoop 中处理被激活的文件描述符的事件.mp4
* 043. 往 EventLoop 的任务队列中添加新任务.mp4
* 044. 主线程给子线程添加任务以及如何处理该任务.mp4
* 045. 处理任务队列中的任务.mp4
* 046. 将任务队列中的任务添加到 Dispatcher 的检测集合中.mp4
* 047. 任务队列中节点在 Dispatcher 中的删除和修改.mp4
* 048. 子线程 WorkerThread 的实现.mp4
* 049. 线程池 ThreadPool 的初始化.mp4
* 050. 线程池的启动和从线程池中取出一个反应堆实例.mp4
* 051. Buffer 的创建和销毁.mp4
* 052. Buffer 的扩容.mp4
* 053. Buffer 的数据写入-直接写.mp4
* 054. 通过 Buffer 接收套接字数据.mp4
* 055. 创建并初始化 TcpServer 实例.mp4
* 056. 启动 TcpServer.mp4
* 057. 主线程反应堆模型的事件添加和处理详解.mp4
* 058. 创建一个 TcpConnection 实例.mp4
* 059. 在 TcpConnection 接收客户端数据.mp4
* 060. HttpRequest 的定义和初始化.mp4
* 061. HttpRequest 资源重置和销毁.mp4
* 062. 添加和查找 HttpRequest 请求头.mp4
* 063. 解析请求行(通过指针方式解析非 sscanf 方式).mp4
* 064. 优化解析请求行的代码.mp4
* 065. 解析请求头并存储.mp4
* 066. 解析完整的 http 请求协议.mp4
* 067. 处理 http 请求 - 上.mp4
* 068. HttpResponse 的定义和初始化.mp4
* 069. HttpREsponse 添加响应头和内存释放.mp4
* 070. ** HttpResponse 响应消息.mp4
* 071. 处理 Http 请求 - 下.mp4
* 072. 修改发送目录和文件的函数.mp4
* 073. 在 TcpConnection 中接收并解析 Http 请求消息.mp4
* 074. 给客户端回复数据的两种方式-上.mp4
* 075. 给客户端回复数据的两种方式 - 下.mp4
* 076. 内存资源的释放.mp4
* 077. 程序的编译和错误的修改 - 上.mp4
* 078. 程序的编译和bug的修改 - 下.mp4
* 079. 启动服务器和添加日志功能.mp4
* 080. 程序的调试和bug修改 - 上.mp4
* 081. 程序的调试和bug修改 - 下.mp4
* 082. 使用CPP重构项目-前言.mp4
* 083. 重构 Channel 类.mp4
* 084. 重构 Dispatcher 类.mp4
* 085. 重构 EpollDispatcher 类.mp4
* 086. 重构 PollDispatcher 类.mp4
* 087. 重构 SelectDispatcher 类.mp4
* 088. 重构 EventLoop 类 - 1.mp4
* 089. 重构 EventLoop 类 - 2.mp4
* 090. 重构 EventLoop l类 - 3.mp4
* 091. 重构 EventLoop 类 - 4.mp4
* 092. 重构 EventLoop 类 - 5.mp4
* 093. 重构 ThreadWorker 类.mp4
* 094. 重构 ThreadPool 类.mp4
* 095. 重构 TcpServer 类.mp4
* 096. 重构 Buffer 类 - 上.mp4
* 097. 重构 Buffer 类 - 下.mp4
* 098. 重构 HttpRequest 类 - 1.mp4
* 099. 重构 HttpRequest 类 - 2.mp4
* 100. 重构 HttpRequest 类 - 3.mp4
* 101. 重构 HttpRequest 类 - 4.mp4
* 102. 重构 HttpResponse 类.mp4
* 103. 重构 HttpResponse 类 - 续.mp4
* 104. 重构 TcpConnection 类 - 上.mp4
* 105. 重构 TcpConnection 类 - 下.mp4
* 106. 多反应堆服务器事件处理流程梳理.mp4
* 107. 程序的编译和语法上的bug修改.mp4
* 108. 测试和bug修改.mp4
* 109. 内容更正.mp4
配套笔记(4 份 PDF)
* Http Web 服务器.pdf
* Http_高并发服务器 概述.pdf
* 图解HTTP-彩色版.pdf
* 项目模块-xmind.pdf





![大疆维修,无人机维修教程[66.30GB]](/_next/image?url=https%3A%2F%2Fwww.itzhibei.com%2Fapi%2Fuploads%2Fb6a69810-862f-479c-a529-d66880073ebc.jpg&w=1920&q=75)