# 基于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应用程序在运行时消耗大量内存,如果已经超出系统可用内存,则会导致程序崩溃。
>
> - 程序中存在内存泄漏:内存泄漏通常发生在动态分配内存,并没有正确释放这些内存块,导致程序消耗的内存越来越大,最终导致程序崩溃。
>
> - 程序中�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。
资源推荐
资源详情
资源评论
收起资源包目录
基于QT实现的网盘系统源码+项目说明.zip (50个子文件)
code_20105
TCPServer
protocol.h 4KB
mytcpserver.cpp 2KB
tcpserver.ui 766B
mytcpsocket.h 1014B
server.config 14B
tcpserver.cpp 1KB
config.qrc 92B
tcpserver.h 424B
main.cpp 260B
operatedb.h 1KB
TCPServer.pro 802B
protocol.cpp 365B
cloud.db 24KB
TCPServer.pro.user 19KB
mytcpserver.h 622B
mytcpsocket.cpp 22KB
operatedb.cpp 9KB
TCPClient
protocol.h 4KB
operatewidget.cpp 1KB
privatechat.cpp 2KB
TCPClient.pro 988B
booklist.h 199B
tcpclient.ui 2KB
privatechat.h 551B
config.qrc 92B
sharefile.cpp 5KB
icon.qrc 130B
allonline.cpp 2KB
main.cpp 286B
TCPClient.pro.user 19KB
tcpclient.h 2KB
myfriendlist.h 1KB
client.config 14B
netdiskfile.cpp 21KB
myfriendlist.cpp 8KB
allonline.ui 2KB
protocol.cpp 365B
netdiskfile.h 2KB
privatechat.ui 1KB
sharefile.h 1KB
images
file.jpg 9KB
dir.png 81KB
allonline.h 386B
booklist.cpp 131B
tcpclient.cpp 15KB
operatewidget.h 616B
show
show3.png 34KB
show2.png 24KB
show1.png 24KB
README.md 17KB
共 50 条
- 1
资源评论
土豆片片
- 粉丝: 1839
- 资源: 5654
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功