1. 项目核心的数据结构
-
🐧① 用户信息
-
🐧② 会话信息
会话一 :A
与B
进行通话;
会话二:A
与C
进行通话;
会话三:如果此时A
、B
、C
三者进行通话,那么此时就是一个群聊会话;
会话持续的周期是非常长的,一直到把对方好友删除或者退出群聊当前会话才会销毁。 -
🐧③ 消息信息
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
给服务器发送额外的请求,获取文件的内容。
结果:提高客户端访问服务器的并发程度,本来是阻塞式的把所有结果都给客户端,现在是拆成多个部分,哪些先给我返回了,就先显示哪些,灵活调整,按需加载。