客户端及时通讯系统(1)

大寰机器人通讯转换系统(CTS-B1.0) 操作说明 阅读详情

一、核心数据结构介绍

1)用户信息(UserTnfo)
用户的属性

2)会话信息(ChatSessionInfo)
用户与用户之间的聊天会话

3)消息信息(Message)
文本消息
图片消息
文件消息
语音消息

文本消息,是正文的字符串;图片、文件、语言消息,正文是一个二进制序列。
表示字符串,必须使用QString;表示二进制数据,必须使用QByteArray。

1.我们要创建目录然后创建文件来表示我们的核心类,model是MVC结构里的模型(qt Creator中不方便直接创建,我们就手动创建model)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
2.把c++头文件导入到qt里
在这里插入图片描述
在这里插入图片描述
3.qt的Cmake自动更新文件内容,编译qt文件所需要的依赖(qt_add_executable)
在这里插入图片描述
4.命名空间的约定(我设置的当前约定)

1.如果代码所在文件,就是项目的顶层目录中,就直接使用全局的命名空间(不需要手动设置命名空间)
2.如果代码所在文件,在某个子目录中,此时子目录就是文件的命名空间

5.认识static

普通函数:需要把对象构造出来,才能使用普通的函数
加static的函数:不需要先构造函数就可以调用。

6.认识uuid

UUID这个东西,背后是一套算法,就能生成全球唯一的身份标识。

7.认识qDebug

qDebug 打印字符串的时候, 就会自动加上 " “;
qDebug().noquote()可以去除双引号(”")。

二、将本地新项目推送到gitee已有仓库上

在命令窗口中输入:git init
在 Gitee 中 我们刚刚新建的仓库里,去复制仓库的地址
在命令窗口中输入:git remote add origin 你的仓库地址
在命令窗口中输入:git pull origin master
在命令窗口中输入:git add .
在命令窗口中输入:git commit -m “提交项目”
在命令窗口中输入:git push origin master

三、代码实现

3.1 核心数据结构成员变量设计和工具类设计

#pragma once

#include <QString>
#include <QIcon>
#include <QUuid>
#include <QDateTime>
#include <QFile>
#include <QFileInfo>
#include <QDebug>

//创建命名空间
namespace model {

//////////////////////////////////
/// 工具函数. 后续很多模块可能都要用到
//////////////////////////////////

static inline QString getFileName(const QString& path) {
    QFileInfo fileInfo(path);
    return fileInfo.fileName();
}

// 封装一个 "宏" 作为打印日志的方式.
#define TAG QString("[%1:%2]").arg(model::getFileName(__FILE__), QString::number(__LINE__))
// #define TAG "[" << __LINE__ << "]"

// qDebug 打印字符串的时候, 就会自动加上 " "
#define LOG() qDebug().noquote() << TAG

// 要求函数的定义如果写在 .h 中, 必须加 static 或者 inline (当然两个都加也可以), 避免链接阶段出现 "函数重定义" 的问题.
static inline QString formatTime(int64_t timestamp) {
    // 先把时间戳, 转换成 QDateTime 对象
    QDateTime dateTime = QDateTime::fromSecsSinceEpoch(timestamp);
    // 把 QDateTime 对象转成 "格式化时间"
    return dateTime.toString("MM-dd HH:mm:ss");
}

// 通过这个函数得到 秒级 的时间
static inline int64_t getTime() {
    return QDateTime::currentSecsSinceEpoch();
}

// 根据 QByteArray, 转成 QIcon
static inline QIcon makeIcon(const QByteArray& byteArray) {
    //QPixmap提供很多关于图片的处理方法
    QPixmap pixmap;
    //加载数据
    pixmap.loadFromData(byteArray);
    QIcon icon(pixmap);
    return icon;
}

// 读写文件操作.
// 从指定文件中, 读取所有的二进制内容. 得到一个 QByteArray
static inline QByteArray loadFileToByteArray(const QString& path) {
    QFile file(path);
    bool ok = file.open(QFile::ReadOnly);
    if (!ok) {
        LOG() << "文件打开失败!";
        return QByteArray();
    }
    QByteArray content = file.readAll();
    file.close();
    return content;
}

// 把 QByteArray 中的内容, 写入到某个指定文件里
static inline void writeByteArrayToFile(const QString& path, const QByteArray& content) {
    QFile file(path);
    bool ok = file.open(QFile::WriteOnly);
    if (!ok) {
        LOG() << "文件打开失败!";
        return;
    }
    file.write(content);
    file.flush();
    file.close();
}


/////////////////////////////////
/// 用户信息
/////////////////////////////////

//用户信息
class UserInfo{
public:
    QString userId = "";			// 用户编号
    QString nickname = "";			// 用户昵称
    QString description = ""; 		// 用户签名
    QString phone = "";				// 手机号码
    QIcon avatar;					// 用户头像
};

/////////////////////////////////
/// 消息信息
/////////////////////////////////

enum MessageType {
    TEXT_TYPE,		// 文本消息
    IMAGE_TYPE, 	// 图片消息
    FILE_TYPE, 		// 文件消息
    SPEECH_TYPE 	// 语音消息
};

class Message {
public:
    QString messageId = "";				// 消息的编号
    QString chatSessionId = "";			// 消息所属会话的编号
    QString time = "";					// 消息的时间. 通过 "格式化" 时间的方式来表示. 形如 06-07 12:00:00
    MessageType messageType = TEXT_TYPE;// 消息类型
    UserInfo sender;			    // 发送者的信息
    QByteArray content;					// 消息的正文内容
    QString fileId = "";				// 文件的身份标识. 当消息类型为 文件, 图片, 语音 的时候, 才有效. 当消息类型为 文本, 则为 ""
    QString fileName = ""; 				// 文件名称. 只是当消息类型为 文件 消息, 才有效. 其他消息均为 ""

    // 此处 extraInfo 目前只是在消息类型为文件消息时, 作为 "文件名" 补充.
    static Message makeMessage(MessageType messageType, const QString& chatSessionId, const UserInfo& sender,
    const QByteArray& content, const QString& extraInfo) {
        if (messageType == TEXT_TYPE) {
            return makeTextMessage(chatSessionId, sender, content);
        } else if (messageType == IMAGE_TYPE) {
            return makeImageMessage(chatSessionId, sender, content);
        } else if (messageType == FILE_TYPE) {
            return makeFileMessage(chatSessionId, sender, content, extraInfo);
        } else if (messageType == SPEECH_TYPE) {
            return makeSpeechMessage(chatSessionId, sender, content);
        } else {
            // 触发了未知的消息类型
            return Message();
        }
    }

private:
    // 通过这个方法生成唯一的 messageId
    static QString makeId() {
        return "M" + QUuid::createUuid().toString().sliced(25, 12);
    }

    static Message makeTextMessage(const QString& chatSessionId, const UserInfo& sender, const QByteArray& content) {
        Message message;
        // 此处需要确保, 设置的 messageId 是 "唯一" 的
        message.messageId = makeId();
        message.chatSessionId = chatSessionId;
        message.sender = sender;
        message.time = formatTime(getTime()); // 生成一个格式化时间
        message.content = content;
        message.messageType = TEXT_TYPE;
        // 对于文本消息来说, 这俩属性不使用, 设为 ""
        message.fileId = "";
        message.fileName = "";
        return message;
    }

    static Message makeImageMessage(const QString& chatSessionId, const UserInfo& sender, const QByteArray& content) {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = chatSessionId;
        message.sender = sender;
        message.time = formatTime(getTime());
        message.content = content;
        message.messageType = IMAGE_TYPE;
        // fileId 后续使用的时候再进一步设置
        message.fileId = "";
        // fileName 不使用, 直接设为 ""
        message.fileName = "";
        return message;
    }

    static Message makeFileMessage(const QString& chatSessionId, const UserInfo& sender, const QByteArray& content, const QString& fileName) {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = chatSessionId;
        message.sender = sender;
        message.time = formatTime(getTime());
        message.content = content;
        message.messageType = FILE_TYPE;
        // fileId 后续使用的时候进一步设置
        message.fileId = "";
        message.fileName = fileName;
        return message;
    }

    static Message makeSpeechMessage(const QString& chatSessionId, const UserInfo& sender, const QByteArray& content) {
        Message message;
        message.messageId = makeId();
        message.chatSessionId = chatSessionId;
        message.sender = sender;
        message.time = formatTime(getTime());
        message.content = content;
        message.messageType = SPEECH_TYPE;
        // fileId 后续使用的时候进一步设置
        message.fileId = "";
        // fileName 不使用, 直接设为 ""
        message.fileName = "";
        return message;
    }

};

/////////////////////////////////
/// 会话信息
/////////////////////////////////
class ChatSessionInfo {
public:
    QString chatSessionId = "";	  		// 会话编号
    QString chatSessionName = "";		// 会话名字, 如果会话是单聊, 名字就是对方的昵称; 如果是群聊, 名字就是群聊的名称.
    Message lastMessage;				// 表示最新的消息.
    QIcon avatar;						// 会话头像. 如果会话是单聊, 头像就是对方的头像; 如果是群聊, 头像群聊的头像.
    QString userId = "";				// 对于单聊来说, 表示对方的用户 id, 对于群聊设为 ""
};

} //end model

充电桩平台_充电桩系统_充电平台_充电桩_互联互通协议_云快充协议 云快充协议+云快充1.5协议+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩系统桩直连协议。 阅读详情

相关推荐

基于TCP技术在ROS1和ROS2中实现多机通讯

两台主机共用一个网络,分别为ROS1和ROS2版本,为了实现两台主机之间的通讯,采用TCP通讯技术。

如果想成为中心,那么就到中心去吧。 1278

ProIEC104ClientVer1.1:IEC104通讯仿真的强大工具

ProIEC104ClientVer1.1:IEC104通讯仿真的强大工具 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在自动化控制和电力系统通讯领域,IEC60870-5-104通讯协议是国际上广泛采用的标准之一。ProIEC104ClientVer1.1,作为一款基于IEC104的客户端仿真测试软件,为广大开发者提供了一个高效、稳定的仿真测试平台。通过该软件,用...

gitblog_06741的博客 1214

【即时通讯软件系统——开题报告 分享(仅供参考呀)】

目录一、选题目的和意义:二、与本课题相关的技术和方法综述:三、主要设计内容:四、设计的环境、方法及措施: 一、选题目的和意义: 即时通讯软件使人与人的沟通突破时空极限,突破环境极限,使自我突破心理极限。作为使用频率最高的网络软件,即时通讯已经突破了作为技术工具的极限,被认为是现代交流方式的象征,并构建起一种新的社会关系。 目前已有的一些即时通讯软件已经非常多了,如:腾讯QQ,网易泡泡等。这些网络聊天系统已经非常成熟了,不过它们都要求用户必须连接互联网才能够进行通信。目前有很多公司,由于涉及保密信息,公司并

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1万+

海量用户通讯系统(1) 收发信息 客户端和服务端的交互初步

1.message 信息的种类,以及登录的信息长度和内容和结果的信息长度和内容 package message const ( //消息类型给成常量 LoginMesType = "LoginMes" LoginResMesType = "LoginResMes" ) type Message struct { Type string `json:"type"`//消息类型 Data string `json:"data"`//消息的内容 } //定义两个消息,后面如果需要...

weixin_45193103的博客 539

卸载Office 16 Click-to-Run Extensibility Component详细步骤

卸载Office 16 Click-to-Run Extensibility Component详细步骤 第一步:按住键盘上的“Win+R”,打开运行窗口 在运行窗口输入“Installer”回车,打开Installer文件夹 第二步:在Installer文件夹红框最右侧,即“大小”后面,右击选择“其他”,找到“主题”,勾选,点击“确定”,添加主题列成功 第三步:在“主题”列找到“Office 16 Click-to-Run Extensibility Component

M_try的博客 3万+

运算放大器电路仿真实践:从零实现完整示例

通过一个完整的运算放大器电路仿真示例,深入掌握电路仿真的关键步骤与技巧,帮助电子爱好者和工程师快速上手实际项目设计。

weixin_34725745的博客 1317

微服务即时通讯系统的实现(客户端)----(1)

微服务通讯的介绍以及部分前端代码的实现

m0_65558082的博客 1421

从零开始:用Python搭建你的第一个加密货币量化交易机器人(附完整代码)

本文详细介绍了如何使用Python从零开始搭建一个加密货币量化交易机器人,涵盖环境准备、交易所API连接、基础交易策略实现、回测系统构建以及实盘部署等关键步骤。通过完整的代码示例,帮助读者快速掌握数字货币量化交易的核心技术,适合有一定编程基础的投资者入门。

weixin_30415113的博客 463

ENTBOOST V1.0 发布,开源企业IM免费企业即时通讯

为什么80%的码农都做不了架构师?>>> ...

weixin_33795806的博客 235

树莓派4在Bookworm Raspbian系统下无法进入桌面模式(启动后出现彩色画面,然后一直黑屏,但是可以正常启动和ssh)

本文记录了这段比较坎坷的探索之路,由于你的问题不一定是我最终解决方案的,可能是前面探索路上试过的,所以建议按顺序看排除前置问题。 双十一又买了个树莓派 4B,插上之前树莓派 4B 的 TF 卡直接就能使用(毕竟是一样规格的)。但是由于用来连接硬盘的 USB 线是坏的,我以为是系统问题就进行了重装(所以坏掉的线还是直接扔了好)。 重新安装系统就装了最新的 2023-10-10 版本的 64 位的 Raspberry Pi OS,但是出现了一个问题: 启动后出现彩色画面,然后一直黑屏。

ZhongUncle的博客 3735

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3186

基于C#语言开发的IM系统--界面赏析(通讯框架为networkcomms2.3.1)【即将开源】...

c#开源IM系统 名称:微风IM 名称来源: 微  小的意思   是说系统比较简单        风  是由于UI使用的风绪老师多年前在网上开源的高仿真qq2008中的代码,在此表示特别感谢 数据库使用的是mssql 2005. c# 2.0开发 通信框架 networkcomms...

chvft44866的专栏 872

YOLOv8-Pose NCNN Android部署优化实践

本文探讨了在Android设备上高效部署YOLOv8-Pose姿态检测模型的优化实践。通过修改Pose头部导出逻辑,分离后处理到C++端实现,并替换SiLU激活函数为ReLU,显著提升了计算效率。具体步骤包括模型结构优化、ONNX导出、NCNN转换与算子融合,最终在Android端实现了30FPS的稳定推理性能。项目提供了完整的优化思路和实现方案,对移动端AI应用开发具有参考价值。

FJN110的博客 321

Java语言的Springboot框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

云快充协议+云快充1.5协议+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩系统桩直连协议。

juzige03的博客 553

芒果YOLO11改进176:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响

芒果YOLO11改进186:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2126

【制作100个unity游戏之22】3DRPG游戏开发07——其他详细的设计

我们会有有很多单例,如果每个单例都去写会很麻烦,所以我们定义泛型单例模式 Singleton,我们将所有的单例都继承这个泛型单例,就省略很多重复的工作定义一个GameManager类,继承Singleton,控制整个游戏的进度,比如如果主角死了,广播,游戏结束调用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2576

OPC UA通讯

OPC UA通讯

rasens的专栏 851

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

项目名称: 即时通讯系统 《IM》 IMSystem_v1.0

/*项目名称: 即时通讯系统 《IM》  IMSystem_v1.0 版本号:  v1.0 说明: 即时通讯系统由服务端和客户端组成.             服务端和客户端能相互发送接收消息.消息内容包括文本和图片.             接收到的文本和图片保存于本地电脑中,保存地址由自己指定 具体交互要求如下:        欢迎进入即时通讯客

茅十八的博客 875

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Win98與ISA2004客戶端

症狀:ISA2004客戶端在Win98下安裝正常,但是運行後提示無法驗証.解決方法:1)安裝ISA2004 Sp1客戶端2)將ISA Server上客戶端設置為允許非加密通訊. 转载于:https://www.cnblogs.com/chinaver2002/archive/2005/07/13/191764.html...

weixin_30955341的博客 82

【亲测免费】 OPC UA客户端助手uaexpert-v1.5.1-331

OPC UA客户端助手uaexpert-v1.5.1-331 【下载地址】OPCUA客户端助手uaexpert-v1.5.1-331 本仓库提供了一个优秀的OPC UA客户端助手——uaexpert-v1.5.1-331的资源文件下载。该工具在Windows 10 64位系统上进行了测试,能够顺利访问OPC UA服务器,...

gitblog_09818的博客 1258

【免费下载】 高效便捷的OPC UA客户端助手——uaexpert-v1.5.1-331

高效便捷的OPC UA客户端助手——uaexpert-v1.5.1-331 【下载地址】OPCUA客户端助手uaexpert-v1.5.1-331 本仓库提供了一个优秀的OPC UA客户端助手——uaexpert-v1.5.1-331的资源文件下载。该工具在Windows 10 64位系统上进行了测试,能够顺利访问OPC...

gitblog_09815的博客 1142

【开源下载】客户端根据服务器端的指令弹出提示窗口(c#网络通信源码)

Demo可执行文件 Demo源码 开发技术winform c#语言 .net2.0框架 通讯框架:来自英国的 networkcomms2.3.1 (开源 gplv3协议) 进入此页面下载 实现功能 服务器开始监听后 客户端连接上 服务器可以发送消息给客户端 客户端...

chvft44866的专栏 149

Microsoft Update客户端更新

大家好,微软Microsoft Update产品组官方博客于昨天宣布了有关最新的Windows Update客户端更新的消息。根据这则博客,微软从当日开始逐渐向所有Windows 7, Windows Server 2008, Windows 8, Windows RT和Windows Server 2012用户推送新的Microsoft Update和Windows Update客户端。此项

微软大中华区安全博客 2420

银河麒麟V10 SP1安装与使用Thunderbird邮件客户端全流程

本文介绍了在银河麒麟V10SP1操作系统上安装和使用Thunderbird邮件客户端的完整流程。首先通过命令确认系统版本,然后使用APT包管理器一键安装Thunderbird。为获得中文界面,需额外安装简体中文语言包。安装完成后,Thunderbird支持自动配置IMAP/POP3邮箱账户,提供邮件收发、通讯录、日历和任务管理等完整功能。作为开源跨平台的邮件客户端,Thunderbird在信创环境中表现稳定,界面友好,是企业办公的理想选择。

鹏大圣运维 2389

即时通讯系统的想法

可以按照MSNP10协议,在tomcat或Jetty服务器的基础上建立一个 即时通讯系统  这个应该可以实现的 只构建msn server,客户端采用microsoft的messager6.0 或6。1 即支持MSNP9和MSNP10 协议 最近试试

叮叮咚咚 1003

OPC通讯

OPC通讯

rasens的专栏 747
上一篇: 【快速搭建Ubuntu的图形界面】
下一篇: 客户端及时通讯系统(2)
一个小脑袋
一个小脑袋 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄6年 4388粉丝 79原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值