- 博客(23)
- 收藏
- 关注
原创 十二、服务器优雅退出
前面我们实现的服务器都是把黑框叉掉强行关闭,这种方式显然是不够优雅的,可能还有未处理的逻辑节点。所以本节通过捕获信号的方式让服务器安全退出。
2024-08-15 08:34:38
252
原创 十一、实现逻辑层
我们的LogicSystem类为单例类,可以只把这个类写为单例,也可以写一个单例模板类,让其它类继承它就可以形成单例。这里选择第二种,因为后面可能还会实现其他的单例类。C++基础好的同学应该很容易看明白,有不明白的地方可以利用一些ai工具解读一下,也很简单。MSG_HELLO_WORD定义在const.h中,表示消息id。在Session.h中,我们可以添加一个逻辑节点类。
2024-08-14 19:44:57
435
原创 十、消息头完善和使用json序列化
本教程使用的是jsoncpp,安装方式网上有很多,可以自己下载源码编译,也可以使用vcpkg一键安装,我比较推荐使用vcpkg,感觉这个就像 visual studio 的 maven,使用这种方式安装后就不需要自己配置项目的包含目录和库目录了,直接使用。
2024-08-14 10:56:30
583
原创 八、粘包问题处理
关于粘包问题,其实就是tcp缓冲区的大小限制而引发的问题。比如发送缓冲区总大小为10个字节,当前有5个字节数据(上次要发送的数据比如'hello')未发送完,那么此时只有5个字节空闲空间,我们调用发送接口发送abcdefg其实就是只能发送abcde给服务器,那么服务器一次性读取到的数据就很可能是helloabcde。而剩余的fg只能留给下一次发送,下一次服务器接收到的就是fg。这样看来就是两次发送的数据有一部分粘在了一起,就称作粘包。
2024-08-12 15:34:26
1100
原创 七、实现全双工通信
这就是一个全双工通信的基本逻辑,大家可以用之前的同步读写客户端进行运行测试。但是写到这里仍然存在大量缺陷,下一节中将解决粘包问题。
2024-08-11 16:37:49
287
原创 五、实现基于官方案例的异步server
到这里依然是白雪,也是不会再实际项目中使用的,主要有以下原因因为该服务器的发送和接收以应答的方式交互,而并不能做到应用层想随意发送的目的,也就是未做到完全的收发分离(全双工逻辑)。该服务器未处理粘包,序列化,以及逻辑和收发线程解耦等问题。另外,该demo示例为仿照asio官网编写的,其中存在隐患,就是当服务器即将发送数据前(调用async_write前),此刻客户端中断,服务器此时调用async_write会触发发送回调函数,判断ec为非0进而执行delete this逻辑回收session。
2024-08-09 10:03:17
373
原创 四、异步读写api介绍和使用
在上一节中,我们实现了客户端与服务器之间的同步读写,在实际开发中,这套方案是行不通的,从这一小节开始来介绍异步读写的的写法。
2024-08-09 09:13:48
1021
原创 三、同步读写的客户端和服务器示例
这个demo实现起来是比较简单的,也充分利用到了前面所介绍的api。但是,这也是能是个玩具代码,没有任何意义,实际开发中是不可能用这种方式的。这也是某蓝色小电视平台一搜索就出现一大把的卖课视频中所介绍的东西。在后面的更新中,会逐渐加入正真在开发中实用的东西,循序渐进。。。
2024-08-07 19:29:40
603
原创 通过idea新建JavaWeb项目详细教程
Spring Configuration Processor:给自定义的配置类生成元数据信息。根据自己的需求添加依赖,不清楚需要哪些依赖也没关系,可以后续在pom.xml中添加。Spring Boot DevTools:项目热更新,(修改代码后自动重启项目)MyBatis Framework:MyBatis依赖。Lombok:注解、生成get和set方法等作用。方便复制:start.aliyun.com。Spring Web:web项目必须要加。添加完成后点击create,创建成功。
2024-05-17 15:40:29
234
原创 在Qt中搭建SDL2开发环境详细教程
1、进入SDL官网2、点击右上角进入下载页面(可能需要更科学的方式,自行解决)3、根据你的Qt构建套件下载我的套件是MinGW所以就下载minggw版本,点击后会自动进行下载4、解压到D盘(建议放在装软件的地方),然后将bin目录添加到环境变量到这里就安装完成,接下来可以去qt里面测试。
2023-09-29 10:23:44
1890
1
原创 在Qt中搭建ffmpeg开发环境详细教程
1、进入ffmpeg官网2、点击windows图标,再点击Windows builds from gyan.dev3、往下翻找到release builds我们选择shared版的,点击后自动下载。4、解压后可以把文件夹放在D盘,然后将bin目录添加环境变量(添加环境变量应该跟清楚了,不在细说)到此安装完毕,接下来可以去Qt里面测试。
2023-09-28 14:41:53
2015
原创 数据结构:顺序队列的基本操作及实现
一、链队的结构定义#define ElemType inttypedef struct node{ ElemType data; struct node* next;}Qnode, *PQnode;typedef struct { PQnode front, rear;}LinkQueue, *PLinkQueue;二、基本操作的实现//初始化队列PLinkQueue Init_LinkQueue() { PLinkQueue Q; Q = (PLinkQueue)m
2022-05-08 21:41:02
518
原创 数据结构:链式队列的基本操作及实现
一、队列的结构定义#define MaxSize 200#define ElemType inttypedef struct { ElemType data[MaxSize]; int front, rear;}SqQueue, *PSqQueue;二、基本操作的实现//队列初始化PSqQueue Init_Queue() { PSqQueue Q; Q = (PSqQueue)malloc(sizeof(SqQueue)); if (Q) { Q->front
2022-05-05 23:46:56
1069
原创 数据结构:顺序栈的基本操作及实现
一、栈的结构定义//栈的结构定义#define MaxSize 50#define Elemtype inttypedef struct { Elemtype data[MaxSize]; int top;}SqStact, *PSqStact;二、基本操作的实现//初始化一个空栈PSqStact Init_Stact() { PSqStact S = (PSqStact)malloc(sizeof(SqStact)); if (S) { S->top = -1
2022-04-27 09:36:31
2620
原创 数据结构:链表的基本操作实现
本文实现的是带头结点的链表一、链表的定义typedef struct node { ElemType data; struct node* next;}LNode, *LinkList;二、基本操作实现//创建空链表LinkList Creat_LinkList() { LinkList L = (LinkList)malloc(sizeof(LNode)); if (L) { printf("创建成功\n"); L->next = NULL; } else
2022-04-25 21:07:50
1665
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人