# 简易微信实验报告
# 一、简易微信系统的总体设计
## 1.1 服务器:
服务器负责管理数据库与处理接收到的指令。服务器在启动时将保存在硬盘上的数据库备份读入内存,开始等待接收指令。
对于每一个处理指令的周期,服务器首先按照相同的IP地址与端口号创建一个UDP套接字,并在对数据库的操作执行完毕后,向本条指令的发送方发送返回信息,最后关闭套接字。
针对数据库的操作可分为三层:其一是对数据表在内存层面上进行的数据项的获取、插入、删除以及判断存在性的底层操作;其二是针对微信的具体功能设计的对底层操作的封装,这一层使用存在性判断函数为底层操作规避了内存访问的潜在错误;其三是为具体指令服务,完成功能层面的数据库访问的服务器顶层。
图1 **服务器结构示意图**
![](https://www.writebug.com/myres/static/uploads/2022/7/13/eea65e91fff492ee2a522f569ec3192d.writebug)
如图1所示,服务器顶层与socket接口均在server.py文件中实现,而功能安全层和数据库底层分别在manage.py和database.py文件中实现。
## 1.2 客户端:
客户端是由多个由点击事件所触发的窗口所组成的。在启动客户端之初,首先将全部窗口初始化,并打开登录窗口。此外的全部窗口以及所有通信行为都是由现有窗口中的按钮点击所触发的。
在点击有关发送数据按钮时,首先根据所要求的功能和数据生成指令,然后创建UDP套接字,向已指定位置的服务器发送指令,接收返回信息并关闭UDP套接字,最后显示之或是根据之进行判断。
客户端的窗口都是系统窗口的实例,点击右上角的关闭按钮,就可以在任何时候强制地关闭窗口,当最后一个窗口关闭时,系统窗口的实例化进程结束,客户端程序结束。
# 二、协议设计和系统设计
## 2.1 通信协议:
为规范客户端向服务器发送指令以请求服务的处理过程,定义如下指令集。(原文档见cmd_format_v6.txt)
regu_账号_* * * _密码_名字_***:
要求服务器在数据库中添加一条用户信息,包括账号、密码和名字三部分。
lgin_账号_* * * _ 密码_ * * * _***:
要求服务器比对(账号,密码)是否存在,若存在则返回‘1’,否则返回‘0’。
mkfa_ 账号1_ 账号2_***_***_***:
要求服务器在通知列表中添加一条信息,表示账号1向账号2发送了好友请求。
mkf_ 账号1_ 账号2_***_***_***:
要求服务器在好友列表中添加(账号1,账号2)和(账号2,账号1)两条信息。
dlf_ 账号1_ 账号2_***_***_***:
要求服务器在好友列表中删除(账号1,账号2)和(账号2,账号1)两条信息。
sdm_ 账号1_ 账号2_***_***_文字信息:
要求服务器在消息列表中添加一条信息,表示账号1向账号2发送了文字信息,并设置其时间戳为当前时间。
swm_ 账号_***_***_***_***:
要求服务器将消息列表中所有时间戳距现在不超过30分钟的数据项返回。
swf_ 账号_***_***_***_***:
要求服务器将好友列表中所有左项是账号的数据项返回。
swfa_ 账号_***_***_***_***:
要求服务器将通知列表中所有左项是账号的数据项返回。
## 2.2 系统设计:
在数据库底层,定义了获取用户列表数据项、获取好友列表数据项、获取消息列表数据项、获取通知列表数据项、插入用户列表、插入好友列表、插入消息列表、插入通知列表、删除用户列表数据项、删除好友列表数据项、删除通知列表数据项、判断指定用户列表数据项是否存在以及判断指定好友列表数据项是否存在的函数。(见database.py)
在功能安全层,定义了注册、登录、添加好友、删除好友、显示好友、发送消息、发送通知、获取消息以及获取通知的函数。(见manage.py)
在服务器顶层,设置一个循环,循环的每一次迭代是指令处理的一个周期,并设置每经历20个周期将数据库备份一次。(见server.py)
在客户端中,将每一个窗口定义一个类,并分离类中的构造函数与启动函数(见GUI.py),早客户端启动时运行全部实例的构造函数,但只在特定点击事件发生时才运行实例的启动函数。(见client.py)
# 三、协议和系统实现
## 3.1 协议实现:
在server.py文件中,服务器首先获取指令的第0字段,并据此进入不同的程序分支,调用功能安全层的函数并处理数据,然后将结果添加于返回值变量,最后由UDP套接字发送。
## 3.2 系统实现:
在系统正常运行的过程中,多个客户端可同时保持运行状态,每一个客户端的信息都来自客户端向服务器发送的指令的回复信息,如好友列表和消息列表。在服务器端,服务器根据指令到达的先后顺序依次处理指令所要求的操作,并返回数据。
由于服务器的指令处理流程十分扁平化,加之使用UDP协议可以减少一部分时间开销,在实验室条件下完全没有必要担心指令发送冲突,因为服务器有能力在极短的时间内区分出两条几乎同时发送的指令。
如此一来,本系统就使用了单个线程实现了多个用户的异步通信。
# 四、实现结果
## 4.1 注册:
![](https://www.writebug.com/myres/static/uploads/2022/7/13/38953280b38be4527548204757b1085b.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/d1bae6d83e7f857b4d6fb4c957b5b78a.writebug)
## 4.2 登录:
![](https://www.writebug.com/myres/static/uploads/2022/7/13/9351cde4f903f0b90652991a32bc7409.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/3ad8d438240a99e93b596861a990a835.writebug)
## 4.3 发出好友申请:
![](https://www.writebug.com/myres/static/uploads/2022/7/13/3315f4d646083fd733e5f7bbd47b8154.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/df390a863ab25d0864ad83ef36b2b5b1.writebug)
## 4.4 同意添加好友:
![](https://www.writebug.com/myres/static/uploads/2022/7/13/9c363e2c6d6bedcaa77e2297828559fd.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/f5390f3aeeb68ddee03d4a4c10aae548.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/b58ec9b7b44d55eed76e9ca7f0fa39ce.writebug)
## 4.5 发送消息:
![](https://www.writebug.com/myres/static/uploads/2022/7/13/b1cfe801eee837886d1265826d55ef93.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/48e8d2382b841e6b5dc1803472f0dad2.writebug)
## 4.6 发送文件或图片:
![](https://www.writebug.com/myres/static/uploads/2022/7/13/82f4ca370b620c630792e4355de425ed.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/81dc9c706c5952872ac59152a38d77c7.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/7/13/c5ced10f16047ae172aff3c5e1c9d88c.writebug)
shejizuopin
- 粉丝: 1w+
- 资源: 1300
最新资源
- 一对一MybatisProgram.zip
- matlab实现基于多源信息融合的水果虫灾智能检测系统研究-虫灾检测-智能检测系统-matlab-机器学习
- Docker从零走向实战视频(上).zip
- 五相电机邻近四矢量SVPWM模型-MATLAB-Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成; (2)输出部分仿
- 保险箱检测51-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- simpack软件与ansys,abqus联合仿真求解车桥耦合,地震波浪荷载联合仿真分析,全教程模型 1. abaqus-simpack车轨耦合振动分析 2. abaqus-simpack车轨桥耦合
- 单电阻采样 基于单电阻采样的相电流重构算法 keil完整工程 单电阻采样 f103的单电阻,完整工程,带文档,带硬件资料 f3平台的单电阻完整工程,代码详细注释 还有微芯的单电阻smo代码加文档
- IP102中分离出来的害虫数据集,使用yolov9标注
- 华为OD+考试真题+实现过程
- IP102中分离出来的害虫数据集,使用yolov8标注
- 充电器检测9-YOLO(v5至v11)、COCO、Create充电器检测9L、Paligemma、TFRecord、VOC数据集合集.rar
- 基于stm32的通信系统,sim800c与服务器通信,无线通信监测,远程定位,服务器通信系统,gps,sim800c,心率,温度,stm32 由STM32F103ZET6单片机核心板电路、DS18B2
- jQuery信息提示插件
- Docker从零走向实战视频(下).zip
- 华为OD+真题及解析+智能驾驶
- 程序名称:悬架设计计算程序 开发平台:基于matlab平台 计算内容:悬架偏频刚度挠度;螺旋弹簧,多片簧,少片簧,稳定杆,减震器的匹配计算;悬架垂向纵向侧向力学、纵倾、侧倾校核等;独立悬架杠杆比,等效
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈