【Qt】前后端交互---DataCenter类

设计目的

前后端交互系统中,创建并使用数据核心类的目的就是让该类作为客户端的数据中心,也就是说其负责管理客户端的所有数据与服务器的网络通信。

数据持久化

初始化数据文件

该函数设计的目的就是用于检查所需要的文件和目录是否存在,如果不存在创建,确保客户端和服务端的数据都是存储在同一位置上的。

void DataCenter::initDataFile()
{QString basePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);QString filePath = basePath + "/ChatClient.json";QDir dir;if (!dir.exists(basePath)) {dir.mkpath(basePath);}QFile file(filePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {LOG() << "打开文件失败!" << file.errorString();return;}QString data = "{\n\n}";file.write(data.toUtf8());file.close();
}

 加载数据文件

也就是从本地JSON文件中读取数据,将其解析为可用的对象,然后填充到内存中的数据结构中。

void DataCenter::loadDataFile()
{QString filePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/ChatClient.json";QFileInfo fileInfo(filePath);if (!fileInfo.exists()) {initDataFile();}QFile file(filePath);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {LOG() << "打开文件失败!" << file.errorString();return;}QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll());if (jsonDoc.isNull()) {LOG() << "解析JSON文件失败! JSON文件格式错误";file.close();return;}QJsonObject jsonObj = jsonDoc.object();this->loginSessionId = jsonObj["loginSessionId"].toString();this->unreadMessageCount->clear();QJsonObject jsonUnread = jsonObj["unread"].toObject();for (auto it = jsonUnread.begin(); it != jsonUnread.end(); ++it) {this->unreadMessageCount->insert(it.key(), it.value().toInt());}file.close();
}

保存数据文件 

设计该方法的目的就是将当前的数据状态写回到JSON文件,从而确保数据在应用程序重启后依然可以使用。

void DataCenter::saveDataFile()
{QString filePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/ChatClient.json";QFile file(filePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {LOG() << "文件打开失败" << file.errorString();return;}QJsonObject jsonObj;jsonObj["loginSessionId"] = loginSessionId;QJsonObject jsonUnread;for (auto it = unreadMessageCount->begin(); it != unreadMessageCount->end(); ++it) {jsonUnread[it.key()] = it.value();}jsonObj["unread"] = jsonUnread;QJsonDocument jsonDoc(jsonObj);QString s = jsonDoc.toJson();file.write(s.toUtf8());file.close();
}

内存数据管理

 用户信息管理

维护当前登录用户的信息,也就是用来保存当前登录用户的信息、好友列表等相关信息

UserInfo *DataCenter::getMyself()
{return myself;
}void DataCenter::resetMyself(std::shared_ptr<bite_im::GetUserInfoRsp> resp)
{if (myself == nullptr) {myself = new UserInfo();}const bite_im::UserInfo &userInfo = resp->userInfo();myself->load(userInfo);
}

消息管理 

负责管理最近的消息,聊天会话记录、未读信息等相关消息

// 在构造函数中初始化未读消息计数哈希表
DataCenter::DataCenter() : netClient(this)
{unreadMessageCount = new QHash<QString, int>();// 其他初始化操作
}

前后端通信

 异步数据获取

通过netClient对象与服务器通信,使用异步方法来获取数据,避免阻塞线程,从而确保UI响应

void DataCenter::getMyselfAsync()
{netClient.getMyself(loginSessionId);
}

数据同步 

服务器接收到数据后,需要更新本地的数据

void DataCenter::resetMyself(std::shared_ptr<bite_im::GetUserInfoRsp> resp)
{if (myself == nullptr) {myself = new UserInfo();}const bite_im::UserInfo &userInfo = resp->userInfo();myself->load(userInfo);
}

数据核心类与其他类的联系

前后端交互数据存储在DataCenter

数据核心类的作用就是在客户端应用程序中集中管理和存储与前后端交互的相关数据。其是作为数据核心类存在的。 

  • 统一存储应用中所需要的数据,例如用户信息、好友列表、消息记录等,都集中存储在一个地方,方便访问和管理
  • 通过集中管理保证数据一致性,避免不同模块之间的数据不一致的情况
  • 数据共享,通过将需要使用的数据都存放在一个类中,从而供其他的对象对其数据进行调用

DataCenter和MainWindow类的关系

首先MainWindow就是应用程序的主界面,DataCenter是数据管理类,专门负责处理数据的存取与服务器通信。所以两者之间主要存在两种关系。

  • MainWindow是依赖于DataCenter。因为主窗口需要从数据核心类中获取数据显示,就必须显示个人信息,就需要通过数据核心类来获取
  • DataCenter独立于MainWindow。数据核心类是不与界面直接进行交互的,而是专门负责数据处理和存储。

其次从实例对应关系上分析,也就是从数据核心类实例后对象与其他部分的关系分析

  • DataCenter类设计成单例模式,保证整个应用程序中只有一个DataCenter实例,这也是为了确保数据的一致性和共享性
  • 用户级别考虑,因为一个数据核心类中肯定是只可以存储一个用户的数据和信息,也就是说每个用户都会有自己的数据核心类和主窗口实例
  • 用户切换情况下,如果支持多用户的客户端应用程序,那么在多用户切换的情况下,需要清空核心数据类中存储的信息,然后重新加载新的数据

前后端交互过程中Qt应用层和原理层

应用层面 

  • 异步通信机制:客户端发送请求后到服务器后,通常是不会阻塞等待服务器响应的,而是通过异步机制等待结果,所以应用层使用的是异步机制
  • 信号与槽机制:当服务器处理完成请求后并返回结果后,客户端的网络模块会发送一个信号,通知应用程序已经准备好
  • 处理响应:应用程序中预先连接了对应的槽函数,也就是在信号发出后,槽函数就会被调用,进行数据处理和更新页面

原理层面

  • 事件驱动:服务器的运行逻辑是依靠事件驱动模型实现的,也就是当有事件的时候,事件循环会触发相应的处理函数
  • 异步I/O:Qt的网络模块内部使用的是异步IO,当数据到达后,会自动触发信号,但是不会造成线程阻塞
  • 线程安全:信号和槽是可以跨线程工作的,确保不同线程下传递数据的安全性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548714.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

短视频矩阵系统源码开发/矩阵系统OEM搭建--源代码开发经验分享

短视频矩阵系统开发策略 短视频矩阵系统源码的原生开发方法 一、基于原生技术的短视频矩阵系统开发途径 原生编程语言&#xff1a;采用各平台专有的编程语言及开发工具&#xff0c;如iOS平台的Swift或Objective-C&#xff0c;以及平台的Java或Kotlin&#xff0c;确保应用性能与…

[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数

标题&#xff1a;[贪心数学/数学位运算] 两种方法O(1)解决 消减整数 个人主页水墨不写bug 目录 一、题目&#xff1a;消减整数(Newcoder) 二、题目分析 1.理解题意&#xff1a; 2.解决问题 解法详解一&#xff1a;贪心数学 解法一参考代码&#xff1a; 解法详解二&#xf…

WiFi无线连接管理安卓设备工具:WiFiADB

介绍 WiFi ADB 使您能够通过 WiFi TCP/IP 连接直接在设备上轻松调试和测试 Android 应用&#xff0c;无需使用 USB 数据线。在启用 WiFi 上的 ADB 后&#xff0c;打开控制台将电脑连接到设备。 手机和电脑在同一个WiFi然后电脑上运行adb connect x.x.x.x:x命令即可 下载 谷…

MindSearch 部署到Github Codespace 和 Hugging Face Space

和原有的CPU版本相比区别是把internstudio换成了github codespace。 教程是https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/MindSearch/readme_github.md 复现步骤&#xff1a; 根据教材安装环境和创建硅基流动 API 然后启动前后端 然后按照教材部署到 Huggi…

一站式家装服务管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本一站式家装服务管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

基于Hive和Hadoop的病例分析系统

本项目是一个基于大数据技术的医疗病历分析系统&#xff0c;旨在为用户提供全面的病历信息和深入的医疗数据分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

《征服数据结构》哈夫曼树(Huffman Tree)

摘要&#xff1a; 1&#xff0c;哈夫曼树的介绍 2&#xff0c;哈夫曼树的构造 3&#xff0c;哈夫曼树带权路径长度计算 4&#xff0c;哈夫曼树的编码 5&#xff0c;哈夫曼树的解码 1&#xff0c;哈夫曼树的介绍 哈夫曼树(Huffman Tree)也叫霍夫曼树&#xff0c;或者赫夫曼树&am…

学校周赛(1)

A - Short Sort 题目&#xff1a; 思路&#xff1a; 本条题目只允许改一处地方&#xff0c;只有三个字母&#xff0c;我们可以直接枚举所有移动过的结果&#xff0c;同时使用哈希去记录其值&#xff0c;对于每一个输入我们都寻找是否有这个值记录&#xff0c;有则输出YES否则…

微深节能 环形运动机械定位控制系统 格雷母线

微深节能的环形运动机械定位控制系统中的格雷母线&#xff0c;是一种高精度、无磨损的非接触式位置检测系统&#xff0c;特别适用于环形运动机械的定位控制。该系统主要由格雷母线、天线箱、电气柜等关键部件组成&#xff0c;其核心在于格雷母线这一特殊的编码线。 格雷母线概述…

JAVA一站式台球学习平台多端畅享助教教练系统小程序源码

​一站式台球学习平台 —— 多端畅享助教教练系统 &#x1f31f;【开篇&#xff1a;解锁台球新境界】&#x1f31f; 你是否厌倦了传统台球学习的枯燥与局限&#xff1f;想要随时随地&#xff0c;都能享受专业级的台球指导吗&#xff1f;今天&#xff0c;就让我为你揭秘一款颠覆…

JITWatch安装使用方法

JITWatch 版本1.4.2 JDK 版本 11以上 1.下载JITWatch&#xff1a; https://github.com/AdoptOpenJDK/jitwatch/releases/download/1.4.2/jitwatch-ui-1.4.2-shaded-win.jar 2.启动 bat脚本执行&#xff1a;通过启动jar包方式启动JITWatch echo off start cmd /c "ti…

SpringBoot+Activiti7工作流入门实例

目录 文章目录 目录准备Activiti建模工具1、BPMN-js在线设计器1.1 安装1.2 使用说明1.3运行截图 2、IDEA安装Activiti Designer插件2.1安装插件2.2 设置编码格式防止中文乱码2.3 截图 简单工作流入门实例1. 新建Spring Boot工程2. 引入Activiti相关依赖添加版本属性指定仓库添加…

探索分布式IO模块的介质冗余:赋能工业自动化的稳健之心

在日新月异的工业自动化领域&#xff0c;每一个细微环节的稳定性都直接关系到生产线的效率与安全。随着智能制造的深入发展&#xff0c;分布式IO&#xff08;Input/Output&#xff09;模块作为连接现场设备与控制系统的关键桥梁&#xff0c;其重要性日益凸显。我们自主研发的带…

RAG+llamaindex+DSW实操

本文纯干货,不做任何原理性讲解,适合于有一定基础的伙伴进行实践,本次文章将分为以下几个部分来介绍: 环境搭建LlamaIndex 使用本地知识库准备基本原理: 1. 环境搭建 1.1 配置基础环境 创建虚拟环境,环境名称可以自行取,我的是"llamaindex" conda create -n ll…

「iOS」——KVC

iOS学习 前言KVC模式KVC设值KVC取值KVC使用keyPathKVC处理异常处理不存在的key处理nil异常 KVC处理字典KVC高阶消息传递 总结 前言 对KVC模式的简单学习和总结。 KVC模式 KVC&#xff08;Key-Value Coding&#xff0c;键值编码&#xff09;是一种通过字符串来访问对象属性的机…

双端之Nginx+Php结合PostgreSQL搭建Wordpress

第一台虚拟机:安装 Nginx 更新系统包列表: sudo apt update安装 Nginx及php扩展: sudo apt install nginx php-fpm php-pgsql php-mysqli -y启动 Nginx 服务: sudo systemctl start nginx检查 Nginx 是否正常运行: xdg-open http://localhost注意:终端命令打开网址 …

腾讯云SDK产品功能

本文主要介绍音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的核心功能。 直播推流 音视频终端 SDK&#xff08;腾讯云视立方&#xff09;为终端直播场景提供强大的 RTMP、RTC 推流能力&#xff0c;配合云直播&#xff08;CSS&#xff09;全球布局的2000节点&#xff0…

数据结构及基本算法

目录 第一章 概论 第一节 引言 第二节 基本概念和常用术语 第三节 算法的描述与分析 第二章 线性表 第一节 线性表定义和基本运算个 一、线性表的逻辑定义 二、线性表的基本运算 第二节 线性表的顺序存储和基本运算的实现 一、线性表的顺序存储 二、顺序表上基本运算…

【网络安全】-访问控制-burp(1~6)

文章目录 前言   1.Lab: Unprotected admin functionality  2.Lab: Unprotected admin functionality with unpredictable URL   3.Lab: User role controlled by request parameter   4.Lab:User role can be modified in user profile  5.Lab: User ID controlled by…

山海优选电商平台卷轴模式订单系统核心架构解析

山海优选卷轴模式的订单核心源码是涉及订单处理、支付、搜索、状态管理等关键功能的代码部分。由于直接提供完整的源代码可能涉及版权和隐私保护问题&#xff0c;我将基于参考文章中的信息&#xff0c;概述该模式订单核心源码的主要结构和功能点。 一、订单核心源码概述 在山海…