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

本文详细描述了一款聊天软件的服务端和客户端功能,包括用户注册、登录、添加好友、聊天、消息处理等操作。服务端作为MySQL客户端处理请求,并维护在线用户状态。客户端具备UI界面,支持多种交互功能。应用层通信协议定义了客户端与服务器间消息的打包和解包规范。
摘要由CSDN通过智能技术生成

软件功能

服务端软件

以后台进程运行,既作为服务器接收客户端发来的请求,对客户请求做出响应,并发回处理结果.
又作为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间的消息,
每个项包含消息内容,消息方向,时间戳,消息是否已被对方接收标志信息.
服务器同时在以bid命名数据库的needtoproecssfriends中将aid插入.
这样, 从以tid命名的数据库的needtoprocessfriends中取出所有项,打包发回给客户即可.
(7). 处理客户端聊天请求.
客户端聊天包含聊天内容,消息发送者a,消息接收者b
服务器在数据库chatmessages中设置一个表a_b记录ab间的消息,每个项包含消息内容,消息方向,时间戳,消息是否已被对方接收标志信息.
服务器同时在以bid命名数据库的needtoproecssfriends中将aid插入.
b此时在线,服务器给客户端b发一个新消息到达通知消息.通知客户端b有新消息到达.
(8). 处理客户端获取与某个指定对端需要但尚未被处理消息请求.
如客户端a请求获取与客户端b的未被处理消息,服务器在chatmessage数据库的a_b表中检索出所有被对方接收标志为否的消息,打包作为响应返回给a.此外,服务器将chatmessage数据库的a_b表中被取出项的接收标志修改为是.从以aid命名的数据库的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). 点击发送,发出聊天内容
在这里插入图片描述

新消息提醒

上面xu1ben发了消息,发送时ben尚未登录.
现在ben登录,登录后所见如下:
needtoprocessusers中包含xu1,表明xu1ben发了信息,但信息未被ben收到.
这里有表现出本聊天软件好友添加机制的一个特点.
aba可以将b添加为其好友.添加后,a可向b发消息,b显示在a的好友列表.
b,收到a的消息且消息未被其接收时,在bneedtoprocessuser表可见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字节消息时间戳(如此重复待处理消息数量次,以发回所有未处理消息).

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python简易局域网聊天工具通常是一个简单的网络应用程序,利用Python的socket和多线程或多进程技术来实现在同一局域网内的文本通信。常见的做法包括创建一个服务器应用接收消息,然后转发给其他连接的客户端。 以下是一个基本的步骤: 1. **设置服务器**:使用`socket.socket()`创建套接字,并绑定到一个本地地址(如 `('localhost', 9000)`)。监听连接请求,当客户端连接时,为每个新连接开启一个新的线程或进程。 ```python import socket from threading import Thread server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('localhost', 9000)) server.listen() ``` 2. **处理客户端连接**:接受新连接并创建一个子线程或子进程来处理客户端的消息发送和接收。 3. **数据传输**:用循环读取客户端发送的数据,解析后广播给所有连接的客户端;同时将接收到的数据转发给相应的客户端。 4. **用户交互界面**:如果是在GUI环境中,可以使用Tkinter等提供简单的用户界面,如输入框和显示区域,以便用户输入和查看消息。 ```python def handle_client(client_socket): while True: data = client_socket.recv(1024) if not data: break # 客户端断开连接 broadcast(data, client_socket) # 发送广播 def broadcast(data, exclude_socket=None): for client in clients: if client != exclude_socket: client.sendall(data) # 主程序中添加新的客户端连接到clients列表 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

raindayinrain

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

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

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

打赏作者

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

抵扣说明:

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

余额充值