# CQLib **Repository Path**: chenguangxiwei/CQLib ## Basic Information - **Project Name**: CQLib - **Description**: 基于boost::asio的网络库、以及基于此网络库的聊天软件(Qt框架)。本项目的重点是CQ_Base、CQ_Net,其他皆是应用层面的东西,可有可无。CQ_Base将不断的引入新功能,CQ_Net将持续优化、重构。 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 19 - **Created**: 2021-07-31 - **Last Updated**: 2021-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CQNET #### 介绍 CQ-Base是基础组件 包含 高性能日志模块、各种加密算法,hash、AVL Tree、大数处理、线程池 等等,后续将加入redis、内存池等 CQ-Net是基于boost::asio基础网络库 普通PC,万级并发;最高支持千万级并发,目前支持傻瓜式创建 tcp客户端、服务器,后续将加入http,udp以及音视频通信协议。 来看看使用方法,创建一个服务器、客户端,就是如此的简单,详细使用方法,请阅读源码头文件: ``` static void on_read_server(int key, const char* msg, size_t len, void* ptr) { string str = string(msg, len); cout << funcx_cb + itos(key) + ": " + str << endl; logs(info_, itos(key) + "recv: " + str); } static void on_connect_server(int key, void* ptr) { cout << funcx_cb + itos(key) << endl; } static void on_disconnect_server(int key, int error_code, void* ptr) { cout << funcx_cb + itos(key) << endl; } void func_server() { logInit("logs/server"); callbacks_s cbs = { on_read_server, on_connect_server, on_disconnect_server }; int port = 23456; auto server = CQNet()->getServer_Tcp(port, &cbs); cout << "服务器启动成功" << endl; while (true) { Sleep(5000); for (int i = 0; i < 10; i++) { server->write_to_all("hehehehe" + itos(i)); } } } static void on_read_client(const char* msg, size_t len, void* ptr) { string str = string(msg, len); cout << funcx_cb + str << endl; logs(info_, "recv: " + str); } static void on_connect_client(void* ptr) { cout << funcx_cb << endl; } static void on_disconnect_client(int error_code, void* ptr) { cout << funcx_cb << endl; } void func_client() { logInit("logs/client"); callbacks_c cbs = { on_read_client, on_connect_client, on_disconnect_client }; string ip = "127.0.0.1"; int port = 23456; auto client = CQNet()->getClient_Tcp(port, &cbs); cout << "客户端启动成功" << endl; int i = 0; while (true) { client->do_write("hi,server ---I'm " + itos((client->get_key() + i))); if (i > 10)break; i++; } while (true) { Sleep(1000); } } ``` CQ-App是基于CQ-Net做的实验性tcp客户端/服务器demo 后续将支撑客户端完成音视频通信,图片、语音、文件发送,好友管理,群组管理。 CQ-Chat是基于Base、Net、Qt框架的实际项目 后续将加入文件传输、语音、视频聊天,添加好友,发送语音、图片消息。 CQ-Frame是一个基于消息驱动的系统架构设计 ``` // 使用方法如下 #include #include "CQCore.hpp" using namespace std; using namespace CQLIB; using namespace CQFRAME; using MyCallBack = std::function; int GetKey() { static int key = 10086; return ++key; } struct FuncA : public CQVirtualModule { FuncA() { key = GetKey(); } virtual void HandleMsg(int serv_key, int module_key, const string& msg) { cout << "已收到来自微服务 " << serv_key << " 的消息:" << msg << " 而我自己的业务id是:" << module_key << endl; } virtual int GetModuleKey() const { return key; } // 业务模型key要求使用者自己生成,框架不管!最好是基础类型,全局唯一。 int key; }; inline auto GetFuncA() -> std::shared_ptr { return std::make_shared(); } int main() { auto core = GetCQCore(); auto serv1 = GetCQService(1001); auto serv2 = GetCQService(1002); auto serv3 = GetCQService(1003); auto func1 = GetFuncA(); auto func2 = GetFuncA(); core->Attach(serv1); core->Attach(serv2); core->Attach(serv3); serv1->RegModule(func1); serv2->RegModule(func1); serv3->RegModule(func1); serv1->RegModule(func2); serv2->RegModule(func2); serv3->RegModule(func2); core->Notify(1000, "系统收到一条新消息:1000");//这个不可能收到 core->Notify(1001, "系统收到一条新消息:1001");//这个可以收到 core->Notify(1002, "系统收到一条新消息:1002");//这个可以收到 core->Notify(1003, "系统收到一条新消息:1003");//这个可以收到 std::this_thread::sleep_for(std::chrono::milliseconds(1000)); core->Detach(serv2); serv1->UnRegModule(func2); serv3->UnRegModule(func1); // 以上操作完成以后,目前只有1号服务上的模块1、3号服务上的模块2在工作 for (int i = 0; i <10; ++i) { core->Notify(1000, "系统收到一条新消息:0"); core->Notify(1001, "系统收到一条新消息:1"); core->Notify(1002, "系统收到一条新消息:2"); core->Notify(1003, "系统收到一条新消息:3"); } std::system("pause"); return 0; } ``` CQ-Test是对以上库的功能性测试 后续将继续完成基础组件、网络库的详细测试方案。 #### 软件架构 基于消息KEY的分布式系统架构设计,多服多端,高并发。 采用 VisualStudio 2019 + Boost 1.71 + Qt 5.13开发,UI绘制由 Qt Creator 4.9完成。 ![架构](https://images.gitee.com/uploads/images/2020/0531/024527_e6fc7e7a_766467.png "架构.png") #### CQ-Chat 相关截图 登录时,可以实时获取头像;登录后,生成托盘小图标,从服务器拉取好友列表。 ![登录1](https://images.gitee.com/uploads/images/2019/0821/124204_51cea8e9_766467.png "login1.png") ![登录2](https://images.gitee.com/uploads/images/2019/0821/124214_3751864b_766467.png "login2.png") ![登录3](https://images.gitee.com/uploads/images/2019/0821/124224_27b4ad68_766467.png "login3.png") ![主面板1](https://images.gitee.com/uploads/images/2019/0821/124232_b331dea9_766467.png "main1.png") ![主面板2](https://images.gitee.com/uploads/images/2019/0821/124241_5b512e1f_766467.png "main2.png") ![主面板3](https://images.gitee.com/uploads/images/2019/0821/124253_0eeeb757_766467.png "main3.png") ![主面板4](https://images.gitee.com/uploads/images/2019/0821/124300_a85d3f4e_766467.png "main4.png") ![主面板5](https://images.gitee.com/uploads/images/2019/0821/124308_8d624b90_766467.png "main5.png") ![好友界面](https://images.gitee.com/uploads/images/2020/0112/154544_7aa7ff54_766467.png "屏幕截图.png") ![聊天界面](https://images.gitee.com/uploads/images/2020/0112/154620_90300822_766467.png "屏幕截图.png") ![发送消息](https://images.gitee.com/uploads/images/2020/0112/154646_0841cf4b_766467.png "屏幕截图.png")