# 基于QT框架的网盘系统
## 项目介绍
- 基于QT的网盘系统,实现的功能有用户注册、登录、注销、添加好友、删除好友、私聊、群聊、搜索好友、刷新目录、进入目录、返回、删除文件、上传文件、下载文件等,
- 分为客户端和服务器端,两个大的功能模块是好友操作和文件操作,用户的个人信息和好友信息是存储在SQLite数据库中,文件操作的文件是存储在服务器端,
- 设计通信协议,用于接收客户端不同的请求,比如添加好友、删除好友、上传文件、下载文件等,通信协议中还使用了弹性结构体,不同类型的消息申请不同的空间大小,节省内存,提高效率,
- 服务器端使用面向对象编程自定义mytcpsocket类用于和客户端的网络通信,以及与数据库操作、文件操作,
- 客户端在用户注册时对用户的注册密码进行哈希加密,提高用户隐私安全性,客户端还提供了较友好美观的用户界面,如选项卡式界面(用户可以通过点击选项卡(或标签页)来切换不同的窗口或视图),右键菜单(用户通过右键点击弹出菜单供用户选择操作)等。
## 项目的技术要点
1. QT编程
2. TCP Socket网络编程
3. SQLite3数据库
4. 面向对象编程
## 项目需求
1. 用户注册、登录、注销。
2. 好友操作:刷新好友列表,添加好友,删除好友,搜索用户,显示在线用户,私聊,群聊等功能。
3. 文件操作:刷新目录,上传文件,下载文件,删除文件,进入目录,返回等功能。
## 项目过程
1. 安装 SQLite
2. 设计数据表
用户信息表`userInfo`
|字段|类型|约束条件|其他|
|--|--|--|--|
|id|integer|primary key|autoincrement|
|name|varchar(32)|not null||
|pwd|varchar(32)|not null||
用户好友表`friend`
|字段|类型|约束条件|其他|
|--|--|--|--|
|id|integer|主键|外键|
|friendId|integer|主键|外键|
3. 安装Qt
问题:"No suitable kits found" = 没有找到合适的kits套件,在安装Qt Creator时没有安装MinGW,所以只需要进行安装即可。
解决方法:选择安装目录下的“MaintenanceTool.exe”,双击计入组件安装界面,根据自己安装的版本选择MinGW组件,点击下一步。重启后就会出现 kits。
4. 配置文件的加载
- 代码目录下创建配置文件:IP,端口
- 作为资源文件添加入项目,添加前缀,添加文件
- 读取文件,处理数据
5. tcp客户端连接服务器
加载配置文件->产生socket->连接服务器(成功连接服务器会发出connected()信号,以此判断是否成功连接服务器)
->接收服务器数据
->发送数据给服务器
6. 服务器的实现
- 加载配置文件
- 连接数据库
- 接收客户端的连接
加载配置文件及打开数据库->QTcpServer监听(自定义类并继承QTcpServer)->循环接收客户端连接(服务器永不停机->获取新QTcpSocket->与客户端数据交互及数据库操作
7. 通信协议设计
- 弹性结构体:弹性数组
通信协议的设计
uiPDULen(protocol data unity 协议数据单元):发送数据总的大小
uiMsgTpye:消息类型,如注册,登录,加好友
uiMsgLen:实际消息大小
```cpp
//协议结构体
struct PDU //协议数据单元
{
uint uiPDULen; //总的协议数据单元大小
uint uiMsgType; //消息类型
char caData[64]; //文件名
uint uiMsgLen; //实际消息长度
int caMsg[]; //实际消息
};
```
收发数据
服务器为每个客户端生成一个tcpsecket
在客户端和服务端都定义了通信协议`protocol.h` ,协议保持一致
客户端:`QTcpSocket m_tcpSocket;`连接服务器,用户点击按钮发送信息,客户端对信息进行简单判断`on_send_pb_clicked()`,封装后发送给服务器。
- 连接服务器:`connect(&m_tcpSocket,SIGNAL(connected()),this,SLOT(showConnect()));`使用槽函数关联信号
- 发送数据:`m_tcpSocket.write()`直接用socket写过去
服务端:监听客户端的连接请求,生成socket(为每一个客户端生成一个独自的socket),信息处理。
- 监听客户端:设置ip和端口`MyTCPServer::getInstance().listen(QHostAddress(m_strIP),m_usPort);`监听
- 处理请求:在mytcpserver.cpp中`void MyTCPServer::incomingConnection(qintptr socketDescriptor)`一旦连接就会触发,生成socket,并加入到list中
- 生成socket:自定义类MyTcpSocket,槽函数`connect(this, &QIODevice::readyRead, this, &MyTcpSocket::recvMsg);`各自的socket自己产生的消息,自己处理
8. 登录注册注销
- 数据库操作
```shell
F:\Qt\qt_project\TCPServer>sqlite3 cloud.db # 建库
SQLite version 3.43.2 2023-10-10 12:14:04
Enter ".help" for usage hints.
sqlite> create table userInfo(id integer primary key autoincrement, # 建用户表表:id主键自增
(x1...> name varchar(32) unique, # 用户名唯一
(x1...> pwd varchar(32), # 密码
(x1...> online integer default 0); # 是否在线:防止重复登录
sqlite> create table friend(id integer,friendId integer, # 建好友表
(x1...> primary key(id, friendId)); # 组合主键:自己id和朋友id
sqlite> .tables
friend userInfo
sqlite> .quit
```
- 登录注册注销请求和回复
1. 增加通信协议的消息类型:使用枚举
2. 界面设计
3. 注册:用户名唯一,防止重复注册
4. 登录:防止重复登录
5. 退出:将数据库中的在线状态设置为下线状态,并将socket删除
6. 注销:删除好友关系,删除个人信息,删除网盘文件
```cpp
//客户端:编辑ui界面
void TCPClient::on_regist_pb_clicked()//按钮关联的事件
QMessageBox::critical(this,"注册","注册失败:用户名或密码不能为空!");//对用户输入进行简单的正则匹配,并输出提示信息
#include <QRegularExpression> //正则匹配需要的库
m_tcpSocket.write((char*)pdu,pdu->uiPDULen);//把制造好的PDU发送给服务器
//服务器端:数据库操作
#include <QSqlDatabase> //连接数据库
#include <QSqlQuery> //查询数据库
class OperateDB : public QObject//自定义数据库操作类
void init();//连接化数据库
bool handleRegist(const char *name,const char *pwd);//处理注册请求
```
客户端和服务端的交互:
- 通过`socket`写出`write`数据,`read`读出数据
- 槽函数检测消息,有数据则根据消息类型(枚举类型)处理,`connect(&m_tcpSocket,SIGNAL(readyRead()),this,SLOT(recvMsg()));//一旦服务器发送来数据,则接收,并处理`
- 有关数据库操作封装在了类中
- 收发数据,使用switch-case处理不同消息,制造pdu,发送pdu,定义一些宏,方便操作
9. 好友操作界面,文件操作界面
整体界面:GUI编程,和 Java 的`spring`差不多,new组件,然后布局。
只实现了好友操作界面,没有实现功能。
10. 功能实现
- **查看所有在线用户**:客户端发送查看请求 -> 服务器将数据库中在线的用户查询出来并发送给客户端(只发送用户名字) -> 客户端接收在线用户信息并显示
- **搜索用户**:客户端发送查看请求 -> 服务器将数据库中在用户查询(模糊查询)出来并发送给客户端(发送用户的名字,在线状态) -> 客户端接收用户信息并显示 *//客户端发送用户名,服务器查询,返回数据,客户接收数据*
> Qt运行是突然崩溃常见的几个原因:
>
> - 内存使用过多:QT应用程序在运行时消耗大量内存,如果已经超出系统可用内存,则会导致程序崩溃。
>
> - 程序中存在内存泄漏:内存泄漏通常发生在动态分配内存,并没有正确释放这些内存块,导致程序消耗的内存越来越大,最终导致程序崩溃。
>
> - 程序中�
妄北y
- 粉丝: 2w+
- 资源: 1万+
最新资源
- 基于LabVIEW的CRC校验程序
- Python毕业设计-基于Python的天气预测和天气可视化项目(源码+数据库)
- Comsol光子晶体光栅非对称传输
- Mac最新版本的JasperSoft
- 在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示
- Python实现简单的天气数据爬取和可视化(课程设计)
- COMSOL 热流耦合拓扑优化 无量纲-双目标
- comsol光子晶体仿真,拓扑荷,偏振态 三维能带,三维Q,Q因子计算 远场偏振计算
- ECMAScript 6 入门 作者:阮一峰, 的学习源码,供大家学习使用
- 海草云智能修片,一键修图,修人像,修风景,媲美美图、PS,方便快捷
- 含齿根裂纹-轴承内圈,外圈,滚动体的超高自由度斜齿–轴承复合故障特性分析!才用残差法突出故障时域响应,采用包络谱对故障特征频率进行分析,模型难度巨大
- VB 开发access职工工资管理信息系统(系统+开题+论文+任务书
- 电解质锂离子电化学传输模型 基于Nernst-Planck方程构建电解质中锂离子传输机理模型,传递机理包括对流,迁移和扩散作用,可模拟电解质的锂离子浓度,通量和电场结果 可添加正负电极,界面电极动力
- 销售记录数据,包括订单ID、产品种类、销售额、利润、客户区域等
- Comsol三维锂离子叠片电池电化学-热全耦合 采用COMSOL锂离子电池模块耦合传热模块,仿真模拟锂离子电池在充放电过程中产生的欧姆热,极化热,反应热,以及所引起的电芯温度变化
- Comsol石墨烯二维材料 包含太赫兹德鲁得和近红外Kubo两种模型 共7个案例,包含参考文献
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈