基于 flask 的简单聊天室
一、系统功能
用户登录功能
用户发送信息功能
提供可视化图形界面
二、相关技术
使用了 python GUI 类库 中的图形化界面
多任务线程
网络编程
数据库编程
三、总体设计
项目概述:
聊天室是一款 C/S(客户端/服务器端)模式的软件,包含了服务器端程序和客户端程序两部分,客户端发送聊天信息到服务器,服务器将信息转发给其他在线登录的用户。
客户端 john 《----接收《--------
客户端 edward 《-----接收《--------- 服务器
用户端 smith ------》发送---------》
项目环境:
c++
Window10 + python3.7 + pycharm
项目模式:C/S 模式
所用技术:1.python GUI 类库
多任务线程
网络编程
数据库编程
项目架构:
需要的类库:
c++
PYMYSQL 0.10.1
PIP 20.2.4
Flask 1.1.2
config 0.5.0post()
coverage 5.3
Scipy 1.5.4
四、详细设计
客户端:
登录界面:
聊天界面:
服务器端:
作为服务的提供者,负责用户的登录验证,聊天信息转发。
服务端程序工作任务让服务器程序保存所有在线用户的链接,只需要将信息发送给服务器程序,服务器程序负责转发给其他用户服务器 (地址固定)
客户端 john 客户端 edward 客户端 smith
业务逻辑:
开始
创建套接字并监听指定端口
开启线程处理当前客户端请求
多任务线程并发技术
接收客户端请求并判断请求类型
登录请求处理 聊天请求处理
退出
响应协议设计:(通信格式的设计)
为了实现客户端和服务器端之间的通信,约定给客户端发送什么哥是的数据给服务器,服务器又需要返回什么样格式的数据给客户端,客户端会有不同的请求,所以针对不同的请求和响应定义了响应编号,来区分不同的请求和响应。
登录响应格式:”1001|ret|nickname|username”
ret 代表服务器端验证的结果,如果是字符‘0’,则表示服务器端验证失败,后面的 nickname username 会为空字符串,如果 ret 的值是‘1’,表示服务器端验证成功
nickname 为服务器返回的该用户昵称
username 为该用户的用户名。
聊天响应格式“1002|nickname|messages”,nickname 为聊天信息发送者的昵称,messages 为其发送的聊天信息
conflg.py 模块:
定义了服务器需要的一些变量,为实现客户端和服务器端通信而定义的一些数据协议编号,协议编号定义:
```python
数据协议相关配置
REQUEST_LOGIN =’0001’ #登录请求 REQUEST_CHAT = ‘0002’ #聊天请求 RESPONSE_LOGIN_RESULT = ‘1001’ #登录结果响应 RESPONSE_CHAT = ‘1002’ #聊天响应 DELIMITER = ‘|’ #自定义协议数据分割符 ```
Response_protocol.py 模块(响应协议):
定义一些快捷函数用来生成快捷函数 来生成对应格式的响应数据
```python
服务器配置
SERVER_IP = '127.0.0.1' SERVER_PORT = 8090 ```
五、运行结果
阶段一:测试 服务器启动,以及收发消息
启动服务: ---》启动测试
阶段二: 代码优化
套接字封装 优化
服务器通过套接字,及逆行传输数据,进行代码优化
线程优化:
第三阶段 多任务 子线程阶段:
- 有客户端--》服务器
- 编程 客户端--》子线程--》 服务器 -- 》客户端
- 服务器端
客户端:多开
结果:
1 号
2 号
3 号
阶段四:解析数据:
客户端给服务器发送的消息格式:
客户端:
服务器:
对服务器进行优化:对信息进行切割处理:
存入字典的信息,根据切割,划分为不同的信息段,进行不同的操作。
客户端:
服务器端:
阶段五
登录请求的处理:
服务器:
客户端:
- 阶段六
- 数据库阶段: 引入 pymsql 库 引入 config 配置文件
- 数据库链接
获取数据库信息:
测试数据:
阶段七
用户登录检查:
服务器链接数据库:进行测试操作
服务器:
客户端:
用户下线处理:
服务端:
客户端:
用户信息转发:
客户端:
服务器:
阶段八:
用户登录界面设置:
使用 python GUI 自带的组件
按钮的响应:
测试重置:
点击重置:
阶段九
客户端链接数据库并给服务器发送信息测试链接数据:
连接成功的案例
服务器:
客户端:
链接失败的案例
客户端:
注意看协议的返回状态。
阶段十
开启客户端消息线程:
服务端:
客户端:注意 result 的值 状态变化
正确
失败:
阶段十一:
发送消息界面:
六、心得体会
学习知识
了解到后端,客户端,与服务端之间的区别
明白了协议的生成与书写
学会使用 python GUI 界面
理解多线程的使用
学会了链接数据库,进行验证
学会了字典与列表组合并进行切分,来获取内容,并封装在另一个字典中
学会了项目文件的封装
学会了适当的优化代码,提高代码的可阅读性,以及可拓展性
学会了对重复使用代码进行封装优化
学会了如何使用弹窗,以及对界面进行隐藏
后期拓展:
将所有配置信息书写在一个 config.py 文件中,有利于拓展维护。
使用 if 判断,进行判断事件的类型,方便后期代码的拓展。目前只能发送文字信息,因为定义的协议处理中,缺少图片协议。
对于程序后期功能的拓展
目前只有两个功能,使用 if / elif 但是后期增加功能不方便,修改如下
修改后:
遇到的问题
错误提示重述:
Python 报“TypeError: a bytes-like object is required, not ‘str’ ”解决办法
解决办法非常的简单,只需要用上 python 的 bytes 和 str 两种类型转换的函数 encode()、decode()即可
【python】ExceptioninthreadThread-1:Traceback(mostrecentcall...
七、参考资料
CSDN:
c++
CSDN:
CSDN:
附页
数据库代码:
c++
CREATE DATABASE mini_chat;
use mini_chat # 使用 mini_chat
CREATE TABLE user(
user_id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(15) CHARACTER SET utf8 NOT NULL,
user_password VARCHAR(15) CHARACTER SET utf8 NOT NULL,
user_nickname VARCHAR(15) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY(user_id)
);
INSERT into user VALUES(0,'user1','111111','itcast1');
INSERT into user VALUES(0,'user2','111111','itcast2');
INSERT into user VALUES(0,'user3','111111','itcast3');
SELECT * FROM user;
DROP DATABASE mini_chat;
参考文献
- J2EE平台下快速WEB开发的研究与应用(武汉理工大学·李涛)
- 基于J2EE的辽油通信小灵通服务下载系统的设计与实现(电子科技大学·吴文哲)
- 基于.NET自定义控件的社区网站系统研究与实现(武汉理工大学·刘亚)
- 手机软酷网即时通讯软件的设计与实现(电子科技大学·齐迎旭)
- 基于Web下的远程教学系统的设计与实现(吉林大学·王骥)
- J2EE平台下快速WEB开发的研究与应用(武汉理工大学·李涛)
- 基于.NET自定义控件的社区网站系统研究与实现(武汉理工大学·刘亚)
- 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊)
- WEB QQ——基于JMS技术并集成在服务器端的即时通讯系统(成都理工大学·李健)
- J2EE平台下快速WEB开发的研究与应用(武汉理工大学·李涛)
- 基于J2EE的辽油通信小灵通服务下载系统的设计与实现(电子科技大学·吴文哲)
- 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊)
- IOS平台上基于SIP协议的即时通讯软件设计与实现(浙江工业大学·王金龙)
- 理财论坛的设计与实现(吉林大学·王雷)
- 基于FMS的校园即时通讯系统设计与实现(苏州大学·方蓓)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设小屋 ,原文地址:https://bishedaima.com/yuanma/35959.html