Score
0
Watch 13 Star 24 Fork 7

dqsjqian / CQLIBC++Apache-2.0

Join us
Explore and code with more than 5 million developers,Free private repositories !:)
Sign up
基于boost::asio的网络库、以及基于此网络库的聊天软件(Qt框架)。本项目的重点是CQBASE、CQNET,其他皆是应用层面的东西,可有可无。CQBASE将不断的引入新功能,CQNET将持续优化、重构。 spread retract

Clone or download
Loading...
README.md

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 <iostream>
#include "CQCore.hpp"
using namespace std;
using namespace CQLIB;
using namespace CQFRAME;

using MyCallBack = std::function<void(string)>;
int GetKey() {
	static int key = 10086;
	return ++key;
}

struct FuncA : public CQVirtualModule<int, string>
{
	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<FuncA>
{
	return std::make_shared<FuncA>();
}

int main()
{
	auto core = GetCQCore<int, string>();
	auto serv1 = GetCQService<int, string>(1001);
	auto serv2 = GetCQService<int, string>(1002);
	auto serv3 = GetCQService<int, string>(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完成。

架构

CQ-Chat 相关截图

登录时,可以实时获取头像;登录后,生成托盘小图标,从服务器拉取好友列表。

登录1 登录2 登录3 主面板1 主面板2 主面板3 主面板4 主面板5 好友界面 聊天界面 发送消息

Comments ( 2 )

Sign in for post a comment

C++
1
https://gitee.com/dqsjqian/CQLIB.git
git@gitee.com:dqsjqian/CQLIB.git
dqsjqian
CQLIB
CQLIB
master

Help Search