c++全栈聊天项目
1. 简介本项目为c++全栈聊天项目实战,包括PC端QT界面编程,asio异步服务器设计,beast网络库搭建http网关,nodejs搭建验证服务,各服务间用grpc通信,server和client用asio通信等,也包括用户信息的录入等,实现跨平台设计,先设计windows的server,之后再考虑移植到linux中,较为全面的展示c++在实际项目中的应用。
1.在QT创建一个主界面:
新建—>Application—>Qt Widgets Application—>项目名称为lxxchat—>类名为MainWindow—>基类为QMainWindow
2.创建一个登录的对话框:
新建—>Qt—>Qt设计师界面类—>选择界面模板:Dialog without Buttons—>类名为:LoginDialog
3.创建一个资源文件:
新建—>Qt—>Qt Resource File—>名称为rc
4.创建一个注册的对话框
新建—>Qt—>Qt设计师界面类—>选择界面模板:Dialog witho ...
设计模式
1. 设计模式三原则在进行程序设计的时候,要尽可能地保证程序的可扩展性、可维护性和可读性,所以需要使用一些设计模式,这些设计模式都遵循了以下三个原则。
1.1 单一职责原则C++面向对象三大特性之一的封装指的就是将单一事物抽象出来组合成一个类,所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。
设计模式中所谓的单一职责原则:就是对一个类而言,应该仅有一个引起它变化的原因,其实就是将这个类所承担的职责单一化。
1.2 开放封闭原则开放封闭原则:指的是软件实体(类、模块、函数等)可以扩展,但是不可以修改。也就是说对于扩展是开放的,对于修改是封闭的。
开放封闭原则是面向对象设计的核心所在,这样可以给我们设计出的程序带来巨大的好处,使其可维护性、可扩展性、可复用性、灵活性更好。
1.3 依赖倒转原则关于依赖倒转原则,对应的是两条非常抽象的描述:
高层模块不应该依赖低层模块,两个都应该依赖抽象。
高层模块:可以理解为上层应用,就是业务层的实现
低层模块:可以理解为底层接口,比如封装好的API、动态库等
抽象:指的就是抽象类或者接口,在C++中没有接口,只有抽象类
抽象不应 ...
c++11新特性
1. 原始自变量定义原始字符串的方式为:R “xxx(原始字符串)xxx”,其中()两边的字符串可以省略(不省略的时候就要求一样)。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。
用途:主要是防止一些特殊字符,如\t,\n等对想输出的字符串产生影响。
测试程序:
1234567891011121314151617int main() { string str1 = R"hello(D:\hello\world\test.text)hello"; //后面的hello为world就会报错 cout << str1 << endl; string str2 = R"(<html> <head> <title> 海贼王 </title> </head> <body> <p> 我是要成为海贼王的男人 </p> </body></html>)"; cout &l ...
Http高并发服务器项目
1. 简介该项目的架构是B/S架构,也就是说客户端是浏览器,在本地随便一个浏览器即可;服务器是在linux上搭建的一个应用程序,该程序可以是多线程版的,也可以是单反应堆模型或者是多反应堆模型,反正最终都可以给客户端提供服务。
过程:
客户端(浏览器)向服务器发送一个Http请求,服务器就能把指定目录下的资源给到客户端(浏览器),浏览器就能将得到的数据展示到界面上。如果解析不了该文件,就会自动下载到本地,如果能够展示,它在本地指定的下载目录是不会又对应文件的,因为它下载到本地之后,就直接将内容显示到窗口上了,可以理解为它下载下来的只是一个缓存,该缓存能够支撑它在浏览器上把内容显示出来,当数据显示完成之后,浏览器会定期地清除缓存,那么该资源也就不存在了。
2. 单反应堆的服务器模型在网络编程中,为了提高访问通信的效率,就可以使用单反应堆的服务器模型,它是IO多路复用与多线程相结合的一种技术。
设计思路:
在主线程里面,服务器绑定本地的ip和端口来得到一个通信的套接字,因为通信的套接字需要监听它的读事件,所以就将它的读事件注册给Reactor,也就是反应堆模型。该反应堆模型底层用到 ...
Qt斗地主项目(下)
1. 结束面板窗口类EndingPanel结束面板窗口类是用于在当一个玩家打完自己手中的牌时,也就意味着游戏结束。当结束的时候,会在主窗口的正中间跳入一个结束面板窗口,上面记录了各个玩家的得分。
结束分数面板窗口类:新建、c++、c++clase、类名为EndignPanel,基类为QWidget。
1.1 EndingPanel类头文件结束面板窗口类的头文件主要就是定义一些有关结束面板的私有变量,如背景、按钮等。同时也定义一个关于是否继续游戏的信号。
123456789101112131415161718192021class EndingPanel : public QWidget{ Q_OBJECTpublic: explicit EndingPanel(bool isLord, bool isWin, QWidget *parent = nullptr); //获取玩家的得分,并显示 void setPlayerScore(int left, int right, int me);signals: void continueGame(); ...
Qt斗地主项目(上)
1. 简介这是一个基于Qt开发的单机版的斗地主小游戏。该项目一共涉及到的类有如下:
1.卡牌类
单张卡牌:Card
多张卡牌:Cards
2.玩家类
玩家类(父类):Player
机器人玩家(子类):Robot
非机器人玩家(子类):UserPlayer
3.窗口类
游戏开始加载动画窗口:Loading
游戏主窗口:GamePanel
单张卡牌窗口:CardPanel
特效动画窗口:AnimationWindow
游戏窗口中的按钮窗口:ButtonGroup
游戏结束玩家的成绩窗口:EndingPanel
自定义按钮:MyButton
游戏分数面板窗口:ScorePanel
4.游戏策略类
出牌类:PlayHand
游戏策略类:Strategy
5.游戏控制类
游戏控制类:GameControl
6.线程类
机器人玩家抢地主:RobotGrapLord
机器人玩家出牌:RobotPlayHand
7.音频类
控制播放游戏中的所有音频:BGMControl
首先,创建一个项目,项目名为Landlords,再创建一个游戏主窗口类Ga ...
QT基础
1. 简介1.1 什么是QtQt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏,Qt很容易扩展,并且允许真正的组件编程。
Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。
Qt是一套应用程序开发库,但与MFC不同,Qt是跨平台的开发类库。跨平台意味着只需要编写一次程序,在不同平台上无需改动或只需要少许改动后在编译,就可以形成在不同平台上运行的版本。
1.2 Qt特征1.面向对象
Qt具有模块设计和控件或元素的可重用性的特点。一个控件不需要找到它的内容和用途,通过Signal和slot与外界通信、交流。而且Qt的控件都可通过继承。
2.控件间的相互通信
Qt提供signal和slo ...
c++并发编程(下)
1. 引用计数实现无锁并发栈1.1 简介在C++并发编程中提出了两种计数,一种是外部计数,一种是内部计数,二者加起来就是有效的引用计数,下面提出一种新的方法,利用引用计数实现无锁并发的栈。
1.2 代码实现栈结构函数:栈函数里面实现了栈的默认构造函数、析构函数和创建了一个原子类型的头部节点,同时也定义好了栈的内部节点类型。
12345678910111213141516171819template<typename T>class single_ref_stack {public: single_ref_stack():head(nullptr) {} //默认构造函数 ~single_ref_stack() { //析构函数 while (pop()); //循环出栈 }private: struct ref_node { //引用节点(栈的内部节点) st ...
c++并发编程(中)
1. 内存顺序和内存模型使用实现1.1 sequencial consistent模型(最严格的)memory_order_seq_cst代表全局一致性顺序,可以用于 store、 load 和 read-modify-write 操作实现 sequencial consistent的顺序模型。在这个模型下, 所有线程看到的所有操作都有一个一致的顺序,即使这些操作可能针对不同的变量,运行在不同的线程。
在下面程序中,线程1修改完x和y的值,线程2立刻就能见到x和y修改的值,所以当线程2读到y为true时就会退出循环,然后读到的x也一定为true。因为需要保证与线程1修改顺序是一致的,线程1修改了x再修改y,当线程1修改完y的时候,x早就被修改为true了,所以当线程2读到了y为true时,接下来读到的x也一定为true。这样的话,z就是从0变为1,就不会发生断言。
1234567891011121314151617181920212223242526std::atomic<bool> x, y; //定义两个bool类型的原子变量std::atomic<i ...
结合epoll和http实现B/S模式
1. 简介epoll 是linux下的一个 I/O 多路复用机制,用于高效地监听多个文件描述符上的 I/O 事件。相较于 select 和 poll,epoll 在处理大量连接时具有更好的性能。而HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。它也是基于B/S架构进行通信的,下面就结合epoll来实现一个能够给浏览器提供服务,供用户借助浏览器访问服务器主机中文件的B/S模式。
2. 代码实现2.1 主函数主函数主要负责把启动程序时,传进来的参数用变量来接收,并检测,当传进来的参数不满3个时,就会报错,最后传入端口,来调用一个监听函数。
123456789101112131415161718int main(int argc, char *argv[]){ //命令行参数获取 端口和server提供的目录 if(argc < 3){ printf("server port path\n"); ...