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

项目模块十二: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.kler.cn/a/376419.html

相关文章:

  • Calling short variants with GATK4
  • 云计算作业二Spark:问题解决备忘
  • PVE定时开启关闭虚拟机,实现PVE中群晖虚拟机的定时开机和关闭
  • Mybatisplus多表关联分页查询有多种实现方式
  • Java实现图片转pdf
  • Flutter配置Android和iOS允许HTTP访问:一步步指南
  • 恋爱脑学Rust之dyn关键字的作用
  • [UUCTF 2022 新生赛]ezpop 详细题解(字符串逃逸)
  • 树莓派5实时时钟(RTC)
  • Ubuntu18升级cmake3.10到cmake3.18
  • AG32系列只用CPLD功能的,CLK从哪个引脚输入呢
  • BGP实验--BGP路由反射器
  • 电能质量治理产品在分布式光伏电站的应用
  • centos 7.9 下载安装mysql5.7
  • 前端 react 面试题(二)
  • JAVA利用方法实现四道题
  • Spring AI : 让ChatGPT成为你构建应用的核心亮点
  • 字符串统计(Python)
  • 什么是 HTTP 代理?它如何工作?
  • Unity 6 来袭
  • 一个系列搞懂23种设计模式
  • 服务器与服务器之间文件上传下载
  • 基于java的移动端自动化测试 - appium-client api -DesiredCapabilities属性有哪些?
  • Mac 配置SourceTree集成云效
  • uniapp 使用 websocket
  • 从方言对话这枚“落子”,看AI手机“棋局”的尴尬赛点