项目模块十二:TcpServer模块

一、模块设计思路

1、目的

对所有模块整合,实现一个服务器模块供外部快速搭建服务器。

2、管理

监听套接字

主 Reactor,创建 EventLoop _baseloop 对象,进行对监听套接字的管理

哈希表管理所有新连接的 Channel

创建线程池进行连接的事件处理

3、功能

设置线程数量

启动服务器

设置新连接回调函数(外部传入连接建立,业务处理,关闭连接,任意事件等待回调函数,TcpServer 再设置给 Connection 最后完成监听套接字的读事件回调函数)

是否启动非活跃连接定时销毁

添加定时任务

4、流程

TcpServer 中创建 Acceptor 对象,并用 _baseloop 对象进行管理

Acceptor 读事件就绪,接收新连接,调用读事件回调函数

创建 Connection 管理新连接

设置新连接回调函数

启动 Connection 超时连接销毁

新连接绑定线程池中返回的下一个线程进行线程安全的事件监控

有事件就绪新连接就处理回调函数

二、成员变量

分配接收到的新连接 id:uint64_t _connid;

绑定端口号:int _port;

超时任务时间:int _timeout;

是否开启超时销毁:bool _inactive_release;

主 Reactor:EventLoop _baseloop;

监听套接字:Acceptor _acceptor;

线程池:LoopThreadPool _pool;

记录新连接:unordered_map<uint64_t, PtrConnection> _conns;

四个外部传入的回调函数:

using ConnectedCallback = function<void(const PtrConnection &)>;

using MessageCallback = function<void(const PtrConnection &, Buffer *)>;

using CloseCallback = function<void(const PtrConnection &)>;

using EventCallback = function<void(const PtrConnection &)>;

using Functor = function<void()>;

ConnectedCallback _connected_callback; // 连接建立后的回调函数

MessageCallback _message_callback;     // 业务处理的回调函数

CloseCallback _close_callback;         // 关闭连接的回调函数

EventCallback _event_callback;         // 任意事件的回调函数

三、成员函数

1、私有函数1:获取新连接后的设置操作(相当于监听套接字读回调)void ConnCallback()

新连接 id++

为新连接创建 Connection,并设置5个回调函数

开启非活跃连接销毁

新连接开始监控读事件

添加新连接

注意:要先非活跃再监控读事件,因为在读事件的回调里面有刷新任务,如果找不到任务队列就会报错

2、私有函数2:删除服务器记录的连接(线程安全) void RemoveConnectionInLoop(const Connection &conn)

找到哈希表里面的指定连接删除

3、私有函数3:删除服务器记录的连接 void RemoveConnecction(const Connection &conn)

绑定 _baseloop 里面的 RunInLoop 函数

4、私有函数4:添加定时任务(线程安全)void AddTaskInLoop(const Functor &task, int timeout)

调用 _baseloop 里面的 TimerAdd 函数

5、公有函数1:构造函数

主 Reactor 要在监听套接字之前初始化

线程池的构造不能在构造函数里面完成,要等线程池数量确定后在启动接口里面初始化

设置监听套接字的读回调函数后,启动监听

6、公有函数2:设置线程数量 void SetThreadCount(int count)

调用 _pool 里面的设置线程数量函数

7、公有函数3:启动非活跃连接销毁 void EnableInactiveRelease(int timeout)

设置非活跃标志位

设置延迟时间

8、公有函数4:添加定时任务 void AddTask(const Functor &task, int timeout)

绑定 _baseloop 里面的 RunInLoop 函数

9、公有函数5:开启服务器 void Start()

线程池初始化

_baseloop 启动

10、设置4个外部回调 

有一个服务器删除连接回调已经在私有函数里面实现,用于新连接的5个回调函数实现

四、代码展示

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

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

相关文章

保险大模型革新:全面自动化倒计时

摘 要 大模型于保险业不仅是一个技术升级的过程&#xff0c;更是一种商业模式的变革 未来将会是一切都连接着AI的世界——科技杂志《连线》创始主编凯文凯利&#xff08;KevinKelly&#xff09;曾在《5000天后的世界》中预测。 ChatGPT催生大模型热潮已将近两年&#xff0c;…

Elasticsearch —— ES 环境搭建、概念、基本操作、文档操作、SpringBoot继承ES

文章中会用到的文件&#xff0c;如果官网下不了可以在这下 链接: https://pan.baidu.com/s/1SeRdqLo0E0CmaVJdoZs_nQ?pwdxr76 提取码: xr76 一、 ES 环境搭建 注&#xff1a;环境搭建过程中的命令窗口不能关闭&#xff0c;关闭了服务就会关闭&#xff08;除了修改设置后重启的…

Python编程中提升效率的8个实用代码

引言 Python 以其简洁易读著称&#xff0c;但有时候&#xff0c;一些巧妙的小技巧能让代码变得更加高效、优雅。本文将介绍八种提升 Python 编程效率的单行代码技巧&#xff0c;帮助你在日常开发中更加得心应手。下面&#xff0c;我们将从基础出发&#xff0c;逐步深入&#x…

Android 音量调节流程分析

音量调节流程分析 按下音量键 音量键被按下后&#xff0c;按键事件会一路派发给Acitivity&#xff0c;如果无人拦截并处理&#xff0c;承载当前Activity的显示PhoneWindow类的onKeyDown()以及onKeyUp()函数将会被处理&#xff0c;从而开始通过音量键调整音量的处理流程&#x…

【设计模式】《Java 设计模式魔法:解锁高效编程的秘密武器》

标题&#xff1a;《Java 设计模式奇幻之旅&#xff1a;解锁高效编程的魔法钥匙》 摘要&#xff1a; 本文将深入探讨 Java 中的十种设计模式&#xff0c;包括单例模式、工厂方法模式、抽象工厂模式…迭代器模式、组合模式、模板方法模式等。通过详细的解释、生动有趣的例子以及…

如何防止U盘盗取电脑数据?

数据安全无论是对企业还是个人都至关重要。这些用户群体随时面临着数据被窃取的风险&#xff0c;而 U 盘则成为了潜在的安全隐患。如果你想要禁止电脑上使用 这类USB 存储设备&#xff0c;看完这篇文章&#xff0c;防止 U 盘盗取数据并非难事。 禁止使用usb存储设备 打开电脑上…

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware &#xff0c;选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 &#xff0c;再点击 硬盘 &#xff0c;再点击 扩展 选择预计扩展的空间&#xff0c;然后点击 扩展…

用 AI 革新医学:从早期检测到精准护理

AI 通过实现早期疾病检测、改进诊断和个性化护理来改变医学。 c AI 与放射科医生合作以提高诊断准确性 一段时间以来,AI 一直是医疗诊断的重要辅助工具。一项日本研究表明,ChatGPT 比该领域的专家进行了更准确的评估。 在执行了 150 次诊断后,神经放射学家记录了 AI 的 80…

vite5 打包项目兼容ie和低版本chrome

背景&#xff1a; vite打包后的项目 在低版本chrome无法使用 直接打包项目在69版本的chrome上无法加载 报错 解决方法&#xff1a; 使用vite官方推荐的插件 vitejs/plugin-legacy 1、下载 npm i vitejs/plugin-legacy -D 2、vite.config.js import legacy from "vit…

最逼真的AI换脸软件,Pluse下载介绍(可直播)

Pluse是基于人工智能的实时AI换脸工具&#xff0c;可以在无需任何前期数据训练的情况下&#xff0c;通过一张照片快速替换视频中的人脸&#xff0c;它支持高分辨率细节重建、色彩矫正&#xff0c;并能实时替换多目标人脸&#xff0c;非常适合娱乐社交、影视制作和虚拟现实等多种…

在米尔电子MPSOC实现12G SDI视频采集H.265压缩SGMII万兆以太网推流

1. 引言 随着网络视频平台的发展&#xff0c;用户对于4K高清画质的需求日益增长。然而&#xff0c;许多用户发现&#xff0c;即使购买了视频平台的会员&#xff0c;观看4K内容时画质却不如预期&#xff0c;有时甚至还会出现模糊、卡顿的情况。这种现象背后涉及到视频编码、网络…

数据结构与算法实验练习(三)(排序及线性表的应用)

数据结构与算法分析课下实验练习&#xff0c;现记录一下解答过程&#xff0c;欢迎大家批评指正。 声明&#xff1a;本题目来源于西安交通大学电信学院原盛老师&#xff0c;任何单位或个人在使用、转载或引用本题目时&#xff0c;请务必标明出处为“西安交通大学电信学院原盛老…

日志代码编写

&#x1f30e;日志代码编写 文章目录&#xff1a; 日志代码编写 了解日志 日志编写       日志等级       获取时间信息       获取文件名行号及处理可变参数列表       以宏的形式传参       日志加锁       日志消息输出方式 完整代码 …

HCIA笔记整合

第一部分&#xff1a; OSI七层模型 应用层&#xff1a;人机交互 抽象语言--------编码 表示层&#xff1a;编码------二进制 会话层&#xff1a;提供会话号 传输层&#xff1a;TCP/UDP 分段&#xff08;收到MTU值的限制&#xff09; MTU&#xff1a;最大传输单元&#xff…

Kafka集群数据迁移方案

概述 MirrorMaker2&#xff08;后文简称 MM2&#xff09;在 2019 年 12 月随 Kafka 2.4.0 一起推出。顾名思义&#xff0c;是为了解决 Kafka 集群之间数据复制和数据同步的问题而诞生的 Kafka 官方的数据复制工具。在实际生产中&#xff0c;经常被用来实现 Kafka 数据的备份&a…

Prometheus监控平台部署与应用

Prometheus特点 多维数据模型 PromSQL&#xff1a;一种灵活的查询语言&#xff0c;可以利用多维数据完成复杂的查询 不依赖分布式存储&#xff0c;单个服务器节点可直接工作 基于HTTP的pull方式采集时间序列数据 推送时间序列数据通过PushGateway组件支持 通过服务发现或静态配…

vue3 栅栏式拖拽布局组件

先看效果&#xff1a; 使用方法&#xff1a; 1、npm install fencelayout 2、引入使用 <template><Fencelayout><!-- 需要写的模块直接嵌套在这个下面就可以 --><div class"aaaa"><a-button>模块1</a-button></div><…

探索设计模式:命令模式

探索设计模式&#xff1a;命令模式 &#x1f9d0;1. 概念&#x1f3af;2. 作用&#x1f4e6;3. 实现3.1 定义命令接口3.2 实现具体命令3.3 实现接收者3.4 实现调用者3.5 使用 &#x1f4bb;4. 应用场景 命令模式&#xff08;Command Pattern&#xff09;就是一种行为型设计模式…

茅台最新任务脚本

茅台最新任务脚本 –小白教程— 这个脚本的作用是实现i茅台应用的自动预约功能&#xff0c;主要功能包括生成请求头、预约商品、计算距离和库存情况、发送微信推送消息等。 代码如下#!/usr/bin/python3cron: 0 0 9/21 * * * new Env(i茅台) import logging import sysimpor…

​CSS之三

CSS三大特性 CSS 有三个非常重要的三个特性:层圣性、继承性、优先级 层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖(层曼)另一个冲突的样式。层曼性主要解决样式冲突的问题 层叠性原则: - 样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个…