软件功能
服务端软件
以后台进程运行,既作为服务器接收客户端发来的请求,对客户请求做出响应,并发回处理结果.
又作为MySQL
服务器客户端,使用MySQL
服务器的数据存储和检索服务.
作为服务端软件,支持的客户端请求有:
(1). 支持客户端注册请求.
先检查后台数据库user
表中用户是否存在,不存在时,允许注册,数据存储到MySQL
服务器的表,向客户返回处理结果.
(2). 支持客户端登录请求.
验证从客户发来的密码,用户名是否和后台数据库中某用户匹配,向客户返回处理结果.且服务器维护所有在线用户的记录.
(3). 支持客户端添加好友请求.
验证要添加的好友id
是否在后台数据库user
表中存在,若存在,在以用户id
命名的数据库的friends
表中添加一项.向客户返回处理结果.
(4). 支持客户端返回好友列表请求.
从客户id
命名的数据库的friends
表中检索出所有项,打包发回给客户.
(5). 支持客户端离线请求.
依据客户端id
,清除服务器维护的在线用户信息中的该用户的项.
(6). 支持客户端t
请求取得所有给其发了信息但信息尚未被自己接收的用户列表的请求.
每次客户a
给客户b
发消息时,客户a
把消息发给服务器,服务器在数据库chatmessages
中设置一个表a_b
记录ab
间的消息,
每个项包含消息内容,消息方向,时间戳,消息是否已被对方接收标志信息.
服务器同时在以b
的id
命名数据库的needtoproecssfriends
中将a
的id
插入.
这样, 从以t
的id
命名的数据库的needtoprocessfriends
中取出所有项,打包发回给客户即可.
(7). 处理客户端聊天请求.
客户端聊天包含聊天内容,消息发送者a
,消息接收者b
.
服务器在数据库chatmessages
中设置一个表a_b
记录ab
间的消息,每个项包含消息内容,消息方向,时间戳,消息是否已被对方接收标志信息.
服务器同时在以b
的id
命名数据库的needtoproecssfriends
中将a
的id
插入.
若b
此时在线,服务器给客户端b
发一个新消息到达通知消息.通知客户端b
有新消息到达.
(8). 处理客户端获取与某个指定对端需要但尚未被处理消息请求.
如客户端a
请求获取与客户端b
的未被处理消息,服务器在chatmessage
数据库的a_b
表中检索出所有被对方接收标志为否的消息,打包作为响应返回给a
.此外,服务器将chatmessage
数据库的a_b
表中被取出项的接收标志修改为是.从以a
的id
命名的数据库的needtoprocessfriends
中删除b
.
客户端软件
客户端软件的形态为普通的聊天软件客户端,有可视的UI
界面.
用户注册
(1). 注册成功
注册成功,注册信息被记录到后台数据库的数据表.
(2). 注册失败
注册的用户已经注册,后台MySQL
服务器未开启,与聊天服务器的网络通知故障.上述情形会导致注册失败.
用户登录
(1). 成功登录
输入的用户名和密码在后台数据库找到匹配时,可成功登录.登录后显示主UI
界面
UI
划分3
块.
(1). Friend List
好友列表,显示所有好友用户名.双击好友列表中一项,可以和指定好友进行一对一聊天
(2). NeedToProcessUsers
待处理用户列表,此列表显示给你发了信息,但信息未被你接收显示的用户列表
(3). 聊天窗口
标题部分在一对一聊天时,显示a to b chat window
内容部分显示双方间聊天的历史记录.编辑部分,用于编辑要发给对方的聊天内容.发送按钮,将聊天请求进行发送.
(4). 登录失败
在输入的用户名和密码在后台数据库中找不到匹配时,在后台数据库未启动时,在与聊天服务器网络连接故障时,上述情形会导致登录失败.
添加好友
(1). 成功添加
(2). 添加失败
输入的用户id
在后台数据库不存在,后台数据库关闭,与聊天服务器的连接故障,上述情形会导致添加失败.
好友间聊天
(1). 双击好友列表某个好友进入与其聊天窗口&
编辑聊天信息
(2). 点击发送,发出聊天内容
新消息提醒
上面xu1
给ben
发了消息,发送时ben
尚未登录.
现在ben
登录,登录后所见如下:
needtoprocessusers
中包含xu1
,表明xu1
给ben
发了信息,但信息未被ben
收到.
这里有表现出本聊天软件好友添加机制的一个特点.
对a
和b
.a
可以将b
添加为其好友.添加后,a
可向b
发消息,b
显示在a
的好友列表.
对b
,收到a
的消息且消息未被其接收时,在b
的needtoprocessuser
表可见a
.
但由于a
不是b
的好友,a
不在b
的好友列表.b
也无法打开与a
的聊天窗口接收消息.
如b
想接收a
的消息,b
可添加a
为好友.然后打开与a
的聊天窗口,则将显示a
发来的消息.
这里,ben为了
接收xu1
的消息,添加xu1
为其好友
好友列表双击xu1
,打开与xu1
的聊天窗口,接收聊天消息
登录好友间的聊天
技术层面
代码模块及其功能
(1). 网络通信模块
网络通信模块采用我进行注释&说明,结构调整后的mymuduo
库.
关于mymuduo
库具体说明参考https://github.com/xubenhao/MyMuduo
在ChatMe
应用中mymuduo
库放在MyMuduo
文件件,被客户端和服务器共同使用,来提供基于TCP/IP
的局域网通信功能
(2)/ MySql
数据库访问模块
采用mysql
提供的c api
进行与mysql
服务器的交互.
提供一个c++
类MySqlAgent
来封装对mysql
提供的c api
的使用
通过该类在服务端我们作为一个mysql
客户端,使用后台mysql
服务器提供的数据存储,数据检索,数据处理服务.
(3). 应用层通信协议设计
客户端到服务器方向会发出的消息目前有8种类别,每种类别及响应字节流打包/解包协议如下:
a. 注册
4
字节长度+2
字节消息类别+1
字节用户id
长度+
用户id
内容+1
字节密码长度+
密码内容
b. 登录
4
字节长度+2
字节消息类别+1
字节用户id
长度+
用户id
内容+1
字节密码长度+
密码内容
c. 添加好友
4
字节长度+2
字节消息类别+1
字节添加方用户id
长度+
用户id
内容+1
字节被添加方用户id
长度+
用户id
内容
d. 获取好友列表
4
字节长度+2
字节消息类别+1
字节用户id
长度+
用户id
内容
e. 离线
4
字节长度+2
字节消息类别+1
字节用户id
长度+
用户id
内容+8
字节登录时间戳
f.获取需要处理用户列表
4
字节长度+2
字节消息类别+1
字节用户id
长度+
用户id
内容
g. 聊天
4
字节长度+2
字节消息类别+1
字节发送方用户id
长度+
用户id
内容+1
字节接收方用户id
长度+
用户id
内容+
聊天内容长度+
聊天内容
h.获取客户间未被处理消息
4
字节长度+2
字节消息类别+1
字节发送方用户id
长度+
用户id
内容+1
字节对端用户id
长度+
用户id
内容
服务器到客户端方向会发出的消息目前有8
种类别,每种类别及响应字节流打包/解包协议如下
a. 注册回复
4
字节长度+2
字节消息类别+1
字节注册结果
b. 登录回复
4
字节长度+2
字节消息类别+1
字节登录结果+8
字节登录时间戳
c. 添加好友回复
4
字节长度+2
字节消息类别+1
字节添加结果
d. 获取好友列表回复
4
字节长度+2
字节消息类别+1
字节好友数量+1
字节好友id
长度+id
内容(如此重复好友数量次,以发回所有好友信息)
e. 获取需要处理用户列表回复
4
字节长度+2
字节消息类别+1
字节好友数量+1
字节好友id
长度+id
内容(如此重复好友数量次,以发回所有用户信息)
f. 聊天回复
4
字节长度+2
字节消息类别+1
字节聊天处理结果
g. 新消息通知
4
字节长度+2
字节消息类别+1
字节发送方用户id
长度+
用户id
内容
h. 得到客户间未被处理消息回复
4
字节长度+2
字节消息类别+2
待处理消息数量+1
字节消息方向+2
字节消息长度+
消息内容+8
字节消息时间戳(如此重复待处理消息数量次,以发回所有未处理消息).