# 基于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应用程序在运行时消耗大量内存,如果已经超出系统可用内存,则会导致程序崩溃。
>
> - 程序中存在内存泄漏:内存泄漏通常发生在动态分配内存,并没有正确释放这些内存块,导致程序消耗的内存越来越大,最终导致程序崩溃。
>
> - 程序中�
土豆片片
- 粉丝: 1853
- 资源: 5869
最新资源
- 毕设和企业适用springboot汽车管理类及教育评价系统源码+论文+视频.zip
- 毕设和企业适用springboot汽车管理类及基因数据分析平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及电力系统优化平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及个性化推荐系统源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及国际贸易平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及视频监控平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及旅游规划平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及市场营销自动化平台源码+论文+视频.zip
- 毕设和企业适用springboot汽车管理类及企业管理平台源码+论文+视频.zip
- 毕设和企业适用springboot汽车管理类及气象数据管理系统源码+论文+视频.zip
- 毕设和企业适用springboot汽车管理类及数字内容管理平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及跨境物流平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及互联网金融平台源码+论文+视频.zip
- 毕设和企业适用springboot区域电商平台类及活动管理平台源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及视频监控系统源码+论文+视频.zip
- 毕设和企业适用springboot人工智能客服系统类及数字内容管理平台源码+论文+视频.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈