一、模块设计思路
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个回调函数实现