局域网简易聊天服务器&客户端

软件功能

服务端软件

以后台进程运行,
既作为服务器接收客户端发来的请求,
对客户请求做出响应,并发回处理结果.
又作为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界面

用户注册

在这里插入图片描述

- 注册成功
注册成功,注册信息被记录到后台数据库的数据表.

在这里插入图片描述

- 注册失败
注册的用户已经注册
后台MySQL服务器未开启
与聊天服务器的网络通知故障
上述情形会导致注册失败

在这里插入图片描述

用户登录

- 成功登录
输入的用户名和密码在后台数据库找到匹配时,可成功登录
登录后显示主UI界面
UI划分3块.
1.Friend List
好友列表,显示所有好友用户名
双击好友列表中一项,可以和指定好友进行一对一聊天
2.NeedToProcessUsers
待处理用户列表,
此列表显示给你发了信息,
但信息未被你接收显示的用户列表
3.聊天窗口
标题部分在一对一聊天时,显示a to b chat window
内容部分显示双方间聊天的历史记录
编辑部分,用于编辑要发给对方的聊天内容
发送按钮,将聊天请求进行发送

在这里插入图片描述

- 登录失败
在输入的用户名和密码在后台数据库中找不到匹配时,
在后台数据库未启动时,
在与聊天服务器网络连接故障时,
上述情形会导致登录失败.

在这里插入图片描述

添加好友

在这里插入图片描述

- 成功添加

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

- 添加失败
输入的用户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字节消息时间戳
[如此重复待处理消息数量次,以发回所有未处理消息]

猜你喜欢

转载自blog.csdn.net/x13262608581/article/details/113881265