基于TCP/QT/C++的网盘系统测试报告

目录

一、项目介绍

1、项目描述

2、项目组成模块

3、项目技术要点

二、用户功能测试

1、查看在线用户测试

1.1、运行服务器

1.2、登录两个账号

1.3、点击显示在线用户,可以看到jack和lucy

2、搜索用户测试

2.1、打开服务器,登录两个账号jack,lucy

2.2、在lucy界面查找jack,提示jack 在线

2.3、找数据库里面的rose

2.4、查询数据库没有的dandanfan

3、添加好友

4、删除好友测试

5、私聊测试

6、群聊测试

三、文件功能测试

1、创建文件夹测试

2、查看文件测试

3、删除文件夹

3.1、删除常规文件

3.2、删除文件夹

3.3、刷新文件夹

4、文件重命名

5、进入文件夹测试

5.1、进入常规文件

5.2、进入文件夹

6、返回上一级测试

7、上传文件

7.1、点击上传文件,选择文件并打开 

7.2、上传大的文件

8、删除常规文件

8.1、删除常规文件 

8.2、删除目录

9、下载文件

9.1、点击需要下载的文件

9.2、选择保存路径

10、分享文件

10.1、常规文件分享测试 

10.2、文件夹分享测试

11、移动文件

11.1、选择要移动的文件

11.2、移动到常规文件

11.3、将文件移动到aaa里面

四、登录注册测试

1、注册测试

1.1、运行TcpServer

1.2、运行TcpClient

1.3、再注册一次tony,就会提示

1.4、查看cloud.db数据库里面是否有数据

2、登录测试

2.1、运行TcpServer

2.2、运行TcpClient

2.3、再登录一次jack,就会提示

2.4、查看cloud.db数据库里面数据是否发生变化,我们发现jack的online字段已经改为1

完结撒花


一、项目介绍

1、项目描述

        随着时代的发展,业务数据量的剧增及移动办公需求,人们对内存的需求越来越强,传统的存储产品,在容量及携带型方面还需要得到提升,因此,网盘应运而生。

        该网盘是能够提供文件同步,备份及共享等服务的网络云存储平台。可以随时随地的把照片、音乐、视频、文档等轻松的保存到网盘,无须担心文件丢失。通过网盘,用户可以多终端上传和下载、管理、分享文件(聊天)。该项目是模仿百度云网盘而产生的项目。

项目描述示意图

        用户可以随时随地地上传下载、编辑和分享文件

        搜索好友、加好友、好友聊天

2、项目组成模块

        采用C/S架构,数据库存储用户信息,磁盘存储用户文件

3、项目技术要点

3.1、多线程:

        客户端:可以同时上传多个数据,在发送和接收信息聊天的时候是同时进行的,接收数据和发送数据是并发的。

        服务器:可以同时处理所有客户端的请求。,服务器存放数据的时候也是可以多线程的

3.2、TCP Socket网络编程

        客户端和服务器的连接,是通过网络连接起来的,数据传输方式TCP,比较可靠。

3.3、SQLite3数据库

        存放用户信息,好友、密码

3.4、面向对象编程

        着重掌握的,使用C++创建对象

二、用户功能测试

1、查看在线用户测试

客户端发送查看请求(只发送用户的名字),服务器将数据库中在线的用户查询出来并发送给客户端,客户端接收在线用户信息并作显示。

1.1、运行服务器

没登陆之前数据库的online的字段都是0

1.2、登录两个账号

1.3、点击显示在线用户,可以看到jack和lucy

2、搜索用户测试

客户端发送查看请求(发送用户的名字,在线状态),服务器将数据库中在线用户查询出来并发送给客户端,客户端接收用户信息并显示。

void Friend::searchUser()
{//搜索用户的时候,会弹出一个对话框来QString name = QInputDialog::getText(this, "搜索", "用户名:");//将名字打印出来if(!name.isEmpty()){qDebug()<<name;PDU *pdu =mkPDU(0);memcpy(pdu->caData, name.toStdString().c_str(),name.size());pdu->uiMsgType = ENUM_MSG_TYPE_SEARCH_USER_REQUEST;TcpClient::getinstance().getTcpSocket().write((char*)pdu, pdu->uiPDULen);free(pdu);pdu = NULL;}
}
2.1、打开服务器,登录两个账号jack,lucy

2.2、在lucy界面查找jack,提示jack 在线

2.3、找数据库里面的rose

2.4、查询数据库没有的dandanfan

3、添加好友

4、删除好友测试

A、客户端A发送删除好友(发送的信息包括双方的用户名)

B、服务器将数据库中好友信息删除,并发送删除信息给客户端A、B

C、客户端B接收信息并显示

bool OperateDB::handleDeleteFriend(const char *name, const char *friendname)
{if(NULL==name||NULL==friendname){return false;}QString data = QString("delete from friend where id=(select id from usrInfo where name=\'%1\') ""and friendId=(select id from usrInfo where name=\'%2\')").arg(name).arg(friendname);//qDebug()<<data;QSqlQuery query;query.exec(data);data = QString("delete from friend where id=(select id from usrInfo where name=\'%1\') ""and friendId=(select id from usrInfo where name=\'%2\')").arg(friendname).arg(name);//qDebug()<<data;query.exec(data);return  true;
}

5、私聊测试

A、客户端A发送私聊信息请求(发送的信息包括双方的用户名,聊天信息)

B、如果双方在线则直接转发给B,不在线则回复私聊失败,对方不在线

C、客户端B接收信息并显示

    case ENUM_MSG_TYPE_PRIVATE_CHAT_REQUEST:{if(PrivateChat::getInstance().isHidden()){PrivateChat::getInstance().show();}char caSendName[32]={'\0'};memcpy(caSendName,pdu->caData,32);QString strSendName = caSendName;PrivateChat::getInstance().setChatName(strSendName);        PrivateChat::getInstance().updateMsg(pdu);break;}

6、群聊测试

A、客户端A发送群聊信息请求(发送的信息包括用户名,聊天信息)

B、服务器转发给所有在线的好友

C、好友接收信息并显示

case ENUM_MSG_TYPE_GROUP_CHAT_REQUEST:{char caName[32] ={'\0'};strncpy(caName, pdu->caData, 32);//那些好友在线QStringList onlineFriend = OperateDB::getInstance().handleFlushFriend(caName);QString tmp;//转发for(int i=0;i<onlineFriend.size();i++){tmp=onlineFriend.at(i);MyTcpServer::getInstance().reSend(tmp.toStdString().c_str(),pdu);}break;}

三、文件功能测试

1、创建文件夹测试

A、当我们注册新用户时,服务器需要用用户名创建一个文件夹,后续该客户端所有的文件都放在以该客户端的用户名的那个文件夹下面。                

B、注册之后,还需要创建文件夹,在文件夹下面再创建文件夹...(可以包含多个子文件夹),这个时候就需要发送用户名用户信息以及新建的文件名发送给服务器。在这里用户名的作用就是服务器根据这个用户名找到应该操作那个文件夹,才是该客户端的文件夹,还有就是创建的新的文件是在那个子文件夹下面。

C、服务器收到请求之后,在服务器端创建新的文件夹,将反馈信息给客户端。反馈信息基本就是两种:创建成功和创建不成功。那么创建失败的原因是有两种:第一种就是这个文件已经存在了,第二种就是系统出现了问题。

D、客户端收到反馈信息之后,将信息显示出来。这样就知道自己是创建成功了还是失败了。

2、查看文件测试

A、首先客户端发送查看请求(包含目录信息)

B、服务器将文件名字还有文件的类型发送给客户端(只发送文件的名字)

C、客户端接收回复信息后,在文件列表里面显示

void Book::updateFileList(const PDU *pdu)
{if(NULL==pdu){return;}FileInfo *pFileInfo =NULL;int iCount = pdu->uiMsgLen/sizeof (FileInfo);for(int i=0 ;i<iCount;i++){pFileInfo =(FileInfo*)(pdu->caMsg)+i;qDebug()<<pFileInfo->caFileName<<pFileInfo->iFileType;QListWidgetItem *pItem = new QListWidgetItem;if(0==pFileInfo->iFileType){pItem->setIcon(QIcon(QPixmap(":/map/dir.jpg")));}else if(1==pFileInfo->iFileType) {pItem->setIcon(QIcon(QPixmap(":/map/reg.png")));}pItem->setText(pFileInfo->caFileName);m_pBookListW->addItem(pItem);}}

3、删除文件夹

A、客户端发送删除请求(包含目录信息和要删除的文件名)

目录信息:目录中还有子目录,子目录中还有子目录,必须将目录信息发送给服务器,这样服务器才知道在那个文件夹下面删除文件

B、服务器接收请求,在指定的文件夹下面,删除指定的文件,并发送回复信息给客户端。(成功失败)

C、客户端接收回复信息并显示。(成功与否)

3.1、删除常规文件

3.2、删除文件夹

3.3、刷新文件夹

4、文件重命名

A、客户端发送重命名请求(包含目录信息,要修改的文件名以及新文件名)

B、服务器收到请求之后,根据该请求中的目录信息以及新旧文件名字,对文件进行重命名,并回复到客户端

C、客户端收到回复信息之后,对该信息进行显示,通知用户重命名成功或者失败

5、进入文件夹测试

A、客户端发送进入文件夹的请求(该请求包含目录信息以及要进入的文件夹名字)

B、服务器收到该请求之后,服务器首先判断路径是否正确。

正确:则进入到该路径中,将新文件夹中的文件信息发送给客户端

不正确:回复失败给客户端

C、客户端接收来自服务器的回复信息并显示

5.1、进入常规文件

5.2、进入文件夹

6、返回上一级测试

A、客户端返回上一级功能的时候,我们首先检查是否是在根目录,如果在根目录则直接返回失败,反之则返回上一级。

B、假如是在某个子目录里面,客户端发送返回上一级请求(包含上一级目录信息,原因是获得上一级的文件信息)

C、服务器收到请求之后,将上一级目录中的文件名发送给客户端,这块就和刷新是一样的

D、客户端接收回复信息并显示

点击jack文件夹,里面的文件有三个,之后点击返回按钮,直接返回到jack部分。再点击一次返回,因为已经是根目录了,所以直接警告 

7、上传文件

 A、客户端发送上传文件请求,请求包括:包括当前路径,上传文件名,上传文件内容

包括当前路径,上传文件名,这个时候不上传文件内容,当服务器接收到上传请求之后,在指定的路径下面,将该文件创建出来,客户端发送上传请求之后,上传文件内容。

B、服务器接收到客户端文件内容,将信息保存到之前创建的文件中,在服务器接受完上传的内容之后,服务器发送信息给客户端

C、客户端接受回复信息并显示

7.1、点击上传文件,选择文件并打开 

发现jack文件夹里面也有了makefile文件 

7.2、上传大的文件

8、删除常规文件

A、客户端发送删除请求(包含目录信息和要删除的文件名)

B、服务器接收请求之后,将请求中的目录及文件名提取出来,删除指定的文件,并将删除结果发送回复给客户端

C、客户端接收到回复信息之后,进行显示

8.1、删除常规文件 

8.2、删除目录

9、下载文件

A、客户端发送下载请求(请求包含路径,下载文件名)

B、服务器提取指定内容以及文件大小发送给客户端

C、客户端循环接收服务器发送过来的文件内容,保存到文件中(客户端需要指定一个位置来保存我们接收到的文件内容,QFileDialog)

9.1、点击需要下载的文件

9.2、选择保存路径

在桌面查看是否下载成功

10、分享文件

A、客户端发送分享文件请求(请求包含分享者、接收者、当前路径以及文件名)

那么PDU应该如何设置呢?分享者放在cadata里面,接收者放在camsg里面,当前路径也是camsg,那都放在一起了,如何做区分呢?将分享者和接收者的个数放在cadata里面,文件名也放在camsg或者将当前路径和文件名拼接,一起放在msg里面。

B、服务器端接收请求,对请求进行操作,并将操作结果返回给客户端

C、客户端接收回复信息并显示

10.1、常规文件分享测试 

登录jack和lucy这两个好友,刷新jack的文件,将test.txt文件发送给lucy,弹出窗口提示之后,刷新lucy文件,发现分享文件成功

10.2、文件夹分享测试

A、用户登录,刷新好友

B、点击图书,刷新文件,共享文件,选择lucy好友

C、点击yes

D、刷新lucy的文件

E、查看文件是否真正分享完成

11、移动文件

A、客户端发送移动文件请求(请求包含当前目录,目标目录)

B、服务器接收请求之后,根据请求中指定的目录和目标目录进行移动,移动完成之后,回复客户端

C、客户端接收到回复信息之后,进行显示

11.1、选择要移动的文件

打开图书,选择要移动的文件,先点击常规文件,点击移动文件按钮,目标目录按钮变亮,可以点击。

11.2、移动到常规文件

点击目标目录,报错。因为是常规文件 

11.3、将文件移动到aaa里面

刚开始test.txt在jack文件夹下

现在在aaa下面

四、登录注册测试

1、注册测试

1.1、运行TcpServer
1.2、运行TcpClient

1.3、再注册一次tony,就会提示

 

1.4、查看cloud.db数据库里面是否有数据

2、登录测试

2.1、运行TcpServer
2.2、运行TcpClient

输入以下信息

2.3、再登录一次jack,就会提示

 

2.4、查看cloud.db数据库里面数据是否发生变化,我们发现jack的online字段已经改为1

完结撒花

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366080.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习——硬件(IIC、ADC)——day56

1. IIC 1.1 定义&#xff08;同步串行半双工通信总线&#xff09; IIC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。是飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备…

Linux高并发服务器开发(八)Socket和TCP

文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点&#xff1a;出错重传 每次发送数据对方都会回ACK&#xff0c;可靠 tcp是打电话的模型&#xff0c;建立连接 使用连接 关闭连接…

【代码随想录】【算法训练营】【第49天】 [300]最长递增子序列 [674]最长连续递增序列 [718]最长重复子数组

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 49&#xff0c;周二&#xff0c;坚持不了一点~ 题目详情 [300] 最长递增子序列 题目描述 300 最长递增子序列 解题思路 前提&#xff1a;最大递增子序列的长度 思路&#xff1a;动态规划 d…

RedHat9 | podman容器-续集

一、管理容器存储和网络资源 使用容器来运行简单的进程&#xff0c;然后退出。可以配置容连续运行特定服务&#xff0c;如数据库服务。如果持续运行服务&#xff0c;需要向容器添加更多的资源&#xff0c;如持久存储或对其他网络的访问权限。 针对企业容器平台上的大型部署&a…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…

遇到多语言跨境电商系统源码问题?这里有解决方案!

从手机到电脑&#xff0c;从线下到线上&#xff0c;如今&#xff0c;跨境电商正在打破地域界限&#xff0c;成为全球贸易的新引擎。在这个全球化的背景下&#xff0c;跨境电商平台的运营也面临着一系列的挑战&#xff0c;其中之一就是多语言问题。如果你遇到了多语言跨境电商系…

【HALCON】如何实现hw窗口自适应相机拍照成像的大小

前言 在开发一个喷码检测软件的时候碰到相机成像和hw窗体的大小不一致&#xff0c;hw太小显示不完全成像的图片&#xff0c;这使得成像不均匀&#xff0c;现场辨别起来比较不直观&#xff0c;因此需要对其进行一个调整。 解决 省略掉读取图片的环节&#xff0c;我们只需要将…

全国产化飞腾模块BIOS下修复系统启动文件

1、背景介绍 全国产飞腾模块采用麒麟信安操作系统&#xff0c;当系统下面的grub.cfg文件被用户误操作导致无法启动时&#xff0c;可以在BIOS下通过U盘中备份的grub.cfg替换硬盘上原来的grub.cfg文件&#xff0c;从而实现启动。 2、操作步骤 首先进入BIOS命令行模式&#xff…

2.3章节Python中的数值类型

1.整型数值 2.浮点型数值 3.复数   Python中的数值类型清晰且丰富&#xff0c;主要分为以下几种类型&#xff0c;每种类型都有其特定的用途和特性。 一、整型数值 1.定义&#xff1a;整数类型用于表示整数值&#xff0c;如1、-5、100等。 2.特点&#xff1a; Python 3中的…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

MySQL-数据操作类型的角度理解 S锁 X锁

文章目录 1、S锁和S锁互相兼容2、S锁和X锁互斥3、X锁和X锁也互斥4、X锁和S锁也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S锁和S锁互相兼容 2、S锁和X锁互斥 3、X锁和X锁也互…

在线疫苗预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;工作人员管理&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;疫苗管理&#xff0c;论坛管理&#xff0c;公告管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;疫苗…

K 近邻、K-NN 算法图文详解

1. 为什么学习KNN算法 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 KNN&#xff08;K-Nearest Neihbor&#xff0c;KNN&#xff09;K近邻是机器学习算法中理论最简单&#xff0c;最好理解的算法…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

(1)Jupyter Notebook 下载及安装

目录 1. Jupyter Notebook是什么&#xff1f;2. Jupyter Notebook特征3. 应用3. 利用Google Colab安装Jupyter Notebook3.1 什么是 Colab&#xff1f;3.2 访问 Google Colab 1. Jupyter Notebook是什么&#xff1f; 百度百科: Jupyter Notebook&#xff08;此前被称为 IPython …

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高&#xff0c;p先和 [] 结合说明p是一个数组&#xff0c;p先和*结合说明p是一个指针 括号保证p先和*结合&#xff0c;说明p是一个指针变量&#xff0c;然后指…

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接&#xff1a;使用ggplot绘制柱状图&#xff0c;在柱子中显示数值和显著性 本期教程 获得本期教程示例数据&#xff0c;后台回复关键词&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可获得往期和未来教程所有数据和代码&#xff09; 往期教程…

Windows宝塔面板部署ThinkPHP8.0创建Vue项目案例

安装ThinkPHP8.0 登录宝塔面板&#xff0c;创建一个站点。 输入composer代码&#xff0c;执行完成后自动创建TP目录 composer create-project topthink/think tp 网站目录设置为tp&#xff0c;运行目录设置为public 设置PHP版本为8.0以上&#xff0c;不然会出现下面的报错代…

1-5题查询 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例题2.1.可回收且低脂的产品2.2.寻找用户推荐人2.3.大的国家2.4. 文章浏览 I2.5. 无效的推文 1. 相关知识点 sql判断&#xff0c;不包含null&#xff0c;判断不出来distinct是通过查询的结果来去除重复记录ASC升序计算字符长度 CHAR_LENGTH() 或 LENGTH(…