【Qt 即时通讯系统】项目核心类的编写

1. 项目核心的数据结构

  • 🐧① 用户信息

  • 🐧② 会话信息
    会话一 : AB进行通话;
    会话二: AC进行通话;
    会话三:如果此时ABC三者进行通话,那么此时就是一个群聊会话;
    会话持续的周期是非常长的,一直到把对方好友删除或者退出群聊当前会话才会销毁。

  • 🐧③ 消息信息
    a.文本消息;b.图片消息;c.文件消息;d.语音消息;

2. 关于项目的命名空间

  • 🍎 如果代码所在的文件就是项目的顶层目录中,此时直接使用全局的命名空间(不需要手动指定)。

  • 🍎 如果代码所在的文件在某个子目录中,此时,就指定一个和目录名字相同的命名空间。

    使代码中命名空间的结构和文件在目录中的结构一致。

3. 核心类的编写

3.1 用户信息
  • 为什么用户编号不用整形而用QString?
    因为MySQL数据库是支持自增主键的,如果是单个节点的mysql,这种自增的方式是没有问题的;但是如果是多个节点的分布式mysql,无法使用整数自增主键了,因为可能出现主键重复的情况。

  • 后续可直接通过uuid或者雪花算法来获得唯一的userId
    在这里插入图片描述

3.2 会话信息
  • 🍎 会话信息的userId是提供谁的呢?
    1)如果会话是单聊会话,则userId表示” 对方 “的用户userId
    2)如果会话是群聊会话,此时userId设为"",后续通过其他的方式来把完整的用户userId列表拿到;
    基于以上两点特征,我们就可以用会话信息的userId来区分是单聊还是群聊

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.3 消息信息
  • ”会话“ 与”消息“ 的关系
    1)会话与消息是属于一对多的关系,一个会话可能会有多个消息。
    2)我们通过这个chatSessionId可以找到消息所属会话的编号。

在这里插入图片描述


  • 🍎消息正文内容的类型为什么是QByteArray呢?
    1)图片、文件、语音消息的正文是一个二进制的序列,表示二进制数据必须使用QByteArray
    2)不同的编码方式,一个 char(字符)对应的字节不同。

    对于英文ASCII来说,一个字符就是一个字节

    对于中文gbk编码来说,一个字符是两个字节

    对于中文utf-8编码来说,一个字符是三个字节


  • 🍎 QString fileId的作用?

1)因为文件、图片、语言这些占用的存储空间是比较大的,一旦聊天会话中包含了多个上述这样的消息,就会使从服务器获取消息列表的操作变得非常低效。

2)针对上述问题如何解决呢? — 是先 ”获取消息列表“,只是拿到文件、图片、语音 消息的fileId,等到客户端得到消息列表之后,再根据拿到的fileId给服务器发送额外的请求,获取文件的内容。

结果:提高客户端访问服务器的并发程度,本来是阻塞式的把所有结果都给客户端,现在是拆成多个部分,哪些先给我返回了,就先显示哪些,灵活调整,按需加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Jie努力认真找工作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值