重写Sylar基于协程的服务器(7、TcpServer HttpServer的设计与实现)

重写Sylar基于协程的服务器(7、TcpServer & HttpServer的设计与实现)

重写Sylar基于协程的服务器系列:

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

重写Sylar基于协程的服务器(1、日志模块的架构)

重写Sylar基于协程的服务器(2、配置模块的设计)

重写Sylar基于协程的服务器(3、协程模块的设计)

重写Sylar基于协程的服务器(4、协程调度模块的设计)

重写Sylar基于协程的服务器(5、IO协程调度模块的设计)

重写Sylar基于协程的服务器(6、HOOK模块的设计)

重写Sylar基于协程的服务器(7、TcpServer & HttpServer的设计与实现)

TcpServer模块架构图

将基于线程的主从Reactor模型进行协程的定制化修改,如图所示。

TcpServer架构图

TcpServer实现

TcpServer类是一个服务器通用类,TcpServer类的实现是Server端专门用来管理Tcp连接的,主要的成员函数及作用如下:

  1. 构造函数,用户在构造一个TcpServer时会传三个类型都为IOManager的参数,参数名以功能命名,分别是:worker、io_worker、accept_worker。

  2. bind函数,因为一台服务器有可能有多个<ip,端口>对,所以用户在调用bind函数时,可能会传入多个地址对,bind函数就是负责为这些ip地址创建套接字,并且将ip地址和固定端口绑定,开始监听这些套接字。

  3. start函数,创建accept协程,并将accept协程放到accept_worker协程调度器里面去,accept协程实际上就是回调函数是TcpServer::startAccept的协程。

    start函数的伪代码:

    start函数伪代码

  4. startAccept函数,是一个接受客户端连接的回调函数,内部是一个调用accept函数的死循环,在接受到一个socketfd后,将套接字封装成IO协程,并放入io_worker协程调度器中进行调度。IO协程就是回调函数是TcpServer::handleClient函数的协程。

    startAccept函数的伪代码:

    StartAcceptor函数伪代码

  5. handleClient函数,该函数是一个虚函数,是专门用来和客户请求对接的协程,在TcpServer中是一个简单打印连接信息的虚函数,想要实现一个实用的服务器(如HTTP服务器、FTP服务器等)只需要对handleClient函数做定制化重写即可。

    handleClient函数伪代码:

    HandleClient函数伪代码

HTTP服务器的实现

HttpServer类继承TcpServer类并重写TcpServer::handleClient函数。
HttpServer类重写了handleClient函数,内部实现为不断调用recvRequest函数的死循环,recvRequest函数底层会调用read函数读取并解析客户请求。在调用revcRequest函数后会将解析的请求提交给Servlet类处理请求,Servlet层会返回回复报文,然后利用sendResponse函数,将回复报文发送回客户端。sendResponse函数底层调用write函数。

handleClient函数重写如下:

HandleClient函数重写

感兴趣的同学,可以阅读一下本文实现的源码:https://github.com/LunarStore/lunar

于此Sylar基础模块设计的讲解完结。

除了基于协程的服务器外,推荐读者也可以去看一下Muduo基于线程的网络库的设计。两者对比着学习才能有更好的理解。sylar相对于Muduo来说,性能确实没那么高,但是sylar设计的初衷是奔着框架去的,所以sylar基础设施做的特别好,比如有Muduo没有的配置模块、动态库模块、daemon模块等,sylar另一大优势是对网络编程友好,可以以同步的方式进程网络业务的编写,同时享受异步的性能。而深入阅读Muduo其实就可以发现Muduo网络库One Loop Per Thread的思想,和Nginx的One Loop Per Process有神奇的相似之处,这种模型,靠着每个线程都有自己的loop和任务队列,将需要跨线程执行的任务添加到各自的队列中去串行执行,加锁的临界区会很小,几乎不需要锁。所以Muduo性能很高。

Muduo源码笔记系列:

muduo源码阅读笔记(0、下载编译muduo)

muduo源码阅读笔记(1、同步日志)

muduo源码阅读笔记(2、对C语言原生的线程安全以及同步的API的封装)

muduo源码阅读笔记(3、线程和线程池的封装)

muduo源码阅读笔记(4、异步日志)

muduo源码阅读笔记(5、Channel和Poller)

muduo源码阅读笔记(6、EvevntLoop和Thread)

muduo源码阅读笔记(7、EventLoopThreadPool)

muduo源码阅读笔记(8、定时器TimerQueue)

muduo源码阅读笔记(9、TcpServer)

muduo源码阅读笔记(10、TcpConnection)

muduo源码阅读笔记(11、TcpClient)


本章完结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

杨中科 ASP.NETCORE 高级14 SignalR

1、什么是websocket、SignalR 服务器向客户端发送数据 1、需求&#xff1a;Web聊天;站内沟通。 2、传统HTTP&#xff1a;只能客户端主动发送请求 3、传统方案&#xff1a;长轮询&#xff08;Long Polling&#xff09;。缺点是&#xff1f;&#xff08;1.客户端发送请求后&…

如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…

1802907-91-0,Methyltetrazine-PEG4-COOH,可以与多种不同的化学基团反应

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Methyltetrazine-PEG4-COOH&#xff0c;Methyltetrazine-PEG4-acid&#xff0c;甲基四嗪-四聚乙二醇-羧基&#xff0c;甲基四嗪-四聚乙二醇-羧酸&#xff0c;甲基四嗪PEG4羧酸&#xff0c;甲基四嗪-PEG4-羧酸 一、基…

基于Java医院管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

爱快安装和双宽带叠加

文章目录 一、爱快安装二、爱快使用1. 配置WAN12. 配置WAN23. 配置LAN14. 配置DHCP5. DNS设置6. 多线负载7. 基础设置 三、通过交换机拨号1. 交换机设置2. 配置WAN1 一、爱快安装 &#xff08;1&#xff09;下载爱快路由ISO版本 爱快路由系统下载 &#xff08;2&#xff09;IS…

群晖NAS开启FTP服务结合内网穿透实现公网远程访问本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP…

请问CTF是什么?请介绍一下关于隐水印的知识特点技术原理应用领域技术挑战

目录 请问CTF是什么&#xff1f; 请介绍一下关于隐水印的知识 特点 技术原理 应用领域 技术挑战 请问CTF是什么&#xff1f; CTF&#xff08;Capture The Flag&#xff0c;夺旗比赛&#xff09;是一种信息安全竞赛&#xff0c;常见于计算机安全领域。这种比赛模拟各种信…

Python中的HTTP代理服务器和客户端的区别与联系

在Python编程中&#xff0c;当我们涉及到网络通信&#xff0c;尤其是HTTP请求时&#xff0c;经常会听到“HTTP代理服务器”和“客户端”这两个词。它们在网络世界中扮演着不同的角色&#xff0c;但又有着紧密的联系。 区别 首先&#xff0c;我们来谈谈它们的区别。 HTTP代理…

Multisim14.0仿真(五十一)74LS42D应用设计

一、74LS42D简介&#xff1a; 74LS42D是4 线 BCD 至 10 线十进制解码器&#xff0c;用在数字电路与单片机控制系统中&#xff0c;以达到通过译码来扩展ip端口的功能。 二、74LS42D逻辑框图&#xff1a; 三、74LS42D功能表&#xff1a; 四、仿真原理图&#xff1a; 五、运行效果…

Rust 本地文档的使用:rustup doc

Rust 是一种系统级编程语言&#xff0c;以其安全性、速度和内存控制能力而闻名。为了方便开发者更好地了解并利用 Rust 标准库和工具链中的功能&#xff0c;Rust 提供了一种内置的文档浏览方式——通过 rustup doc 命令。 安装 rustup 在查阅 Rust 文档之前&#xff0c;确保你…

GCC编译器的使用以及使用Makefile语法进行操控

Makefile 这里使用的Makefile操控编译器 gcc 常见的组成部分 c&#xff1a; gcc 的一个版本&#xff0c;默认语言设置为 C&#xff0c;而且在链接的时候自动包含标准 C 库。这和 g 一样configure&#xff1a; GCC 源代码树根目录中的一个脚本。用于设置配置值和创建 GCC 编…

FPS游戏穿模最强解决方案!开发一款FPS游戏射击游戏真的太简单!

FPS游戏穿模最强解决方案&#xff01;开发一款FPS游戏射击游戏真的太简单&#xff01; 2001年&#xff0c;FPS游戏老大哥《CS》横空出世&#xff0c;迅速在国内外掀起了一波FPS游戏的热潮&#xff0c;随后《CF穿越火线》在国内上线&#xff0c;一举拿下“玩家最喜爱的十大网络…

Java设计模式大全:23种常见的设计模式详解(二)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

Ubuntu使用Docker部署Nginx并结合内网穿透实现公网远程访问

文章目录 1. 安装Docker2. 使用Docker拉取Nginx镜像3. 创建并启动Nginx容器4. 本地连接测试5. 公网远程访问本地Nginx5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 在开发人员的工作中&#xff0c;公网远程访问内网是其必备的技术需求之一。对于…

鸿蒙内核框架

1 内核概述 内核简介 用户最常见到并与之交互的操作系统界面&#xff0c;其实只是操作系统最外面的一层。操作系统最重要的任务&#xff0c;包括管理硬件设备&#xff0c;分配系统资源等&#xff0c;我们称之为操作系统内在最重要的核心功能。而实现这些核心功能的操作系统模…

【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题

目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、经典Next Greater Number问题解法 1、题目介绍 原题链接&#xff1a;496. 下一个更大元素 I - 力扣&#xff08;LeetCode&#xff09; 示例1&#xff1a; 输入&#xff1a;nums1 [4,1,2], nums2 [1,3,4,2].输出&…

【计算机网络】Socket的SO_TIMEOUT与连接超时时间

SO_TIMEOUT选项是Socket的一个选项&#xff0c;用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间&#xff0c;如果在指定的时间内没有数据可读取&#xff0c;将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下&#xff0c;SO_TIMEOUT选项的值…

引入echarts环形图及显示后端数据

实现效果&#xff1a; 1.下载echarts 并引用 npm install echarts --save 或 pnpm install -S echarts 项目中引用&#xff1a; 在项目main.ts中 import * as echarts from "echarts"; //引入echarts 3.页面中使用 <div id"main" class&quo…

近屿智能发布AIGC大模型工程师和产品经理学习路径图

近日&#xff0c;上海近屿智能科技有限公司&#xff08;下称“近屿智能”&#xff09;&#xff0c;基于其在大模型研发和产品设计领域深厚的专业积累&#xff0c;终于总结出AIGC大模型工程师与产品经理的学习路线图。该学习路线图不仅为追求专业发展的学习者提供了一条清晰明确…
最新文章