• 网盘项目分析


    一、需求分析

    1.注册(网络、分析处理数据、数据库)

    2.登录(网络、分析处理数据、数据库)

    3.上传文件列表

    4.上传文件        

    5.下载文件

    6.提取链接

    7.分享链接

    8.聊天

    9.退出

    二、服务器关系 框架:

    各个接口的作用: 

     网络模块(INet):负责收发数据
    数据库模块(MySQL):负责管理数据,对数据进行增删改查
    核心模块(IKernel):负责处理  接收的网络数据,存储数据库的数据 
    IKernel的open初始化网络,服务器启动;TCPIKernel的open数据库就连接了

    三、客户端关系 框架:

    四、过程表述:

    服务器的三个接口,先通过Kernel的open的MYsql和INet启动了数据库和网络,就启动了服务器,

    然后通过ui客户端的Kernel调用接口下的TCPKernel,然后再通过其中的INet里的网络初始化,通

    过他去连接你的服务器,然后客户端和服务器就可以保持连接,随后通过点击ui的任意一个按钮,

    都可以通过Kernel、INet,把数据通过网络传给服务器端,服务器端通过网络接收到数据以后,通

    过Kernel去进行数据处理再通过网络给他发回客户端

    五、答辩:

    一项目介绍:
    首先 我写的是一个网盘项目 
         本次项目以网盘为题目,设计一个基于C/C++语言开发的网盘系统。由QT打造,后台数据库使用MySQL数据库开发而成。
    结合网上诸多的云网盘软件为设计为基础,能很好的去服务客户 所以我也想利用我自己的专业课知识和课余时间所学的知识为自己也设计的一个网盘系统。
    需求的话该系统可以注册用户,已有的用户可以直接登录进入网盘主界面,进行上传文件以及下载文件的功能,也可以提取分享链接,并且也可以正常聊天通信
    然后登录注册包括对文件的操作我基本归类为三大步:网络进行接收数据,然后对数据进行分析处理,最后在数据库进行相关操作,文件过程中也使用到了正常传,断点续传和秒传、MD5的一些算法
    这个项目使我独立完成的,遇到问题自主查询资料去解决问题。通过写这个项目锻炼了我的代码能力,逻辑能力,以及独立思考问题并自主去寻求解决问题方案的能力,同时发现自己不足,我会及时查缺补漏
    尽力纠正自己的不足以及汲取错误经验教训来提高自己的综合能力。

    二、简单的介绍一下各个模块

    我搭建了一个服务器和一个客户端而且主要就是分为客户端和服务器端两端,来模拟进行服务器与用户之间的交互
    首先服务器端有三个模块:
    1.网络模块INet(负责收发数据):主要实现 网络间通信  建立网络链接 卸载网络链接等功能;
    2.处理模块IKernel(负责处理 、接收的网络数据,存储数据库的数据):主要实现对TCPNet模块发来的数据的处理 以及对mysql数据库模块中数据的写入和读取
    3.数据库模块Mysql(负责管理数据,对数据进行增删改查):负责管理和存储处理端TCPKernel传递来的数据 以及负责响应处理端TCPKernel传递来的请求

    客户端也是三个模块: 
    1.处理模块Kernel:也是主要实现 网络间通信  建立网络链接 卸载网络链接等功能
    2.网络模块INet:主要实现对TCPNet模块发来的数据的处理 以及对Widget界面模块的数据交互
    3.ui模块(控制IKernel,把数据显示到Widget):负责构成客户端的界面和控件 从而可以让用户对网盘进行操作,还可以传递控件上的信息.

    我说一下主要过程吧
    服务器的三个接口,先通过Kernel的open的MYsql和INet启动了数据库和网络,就启动了服务器,
    然后通过ui客户端的Kernel调用接口下的TCPKernel,然后再通过其中的INet里的网络初始化,通
    过他去连接你的服务器,然后客户端和服务器就可以保持连接,随后通过点击ui的任意一个按钮,
    都可以通过Kernel、INet,把数据通过网络传给服务器端,服务器端通过网络接收到数据以后,通
    过Kernel去进行数据处理再通过网络给他发回客户端,就完成了我们整体的一个服务器与客户端的一个交互。

    三、接下来为我们的项目配置Mysql数据库及TCP网络模型

    首先介绍我们的注册功能:
    我们约束了用户的u_id , tel , user_name不能和别的用户重复  是唯一的  在数据库中我们对u_id添加了主键约束  对tel , user_name添加了唯一约束

    客户端在登录界面输入相应的信息后点击注册按钮,服务器利用数据库模块在数据库中查找,不存在的话他会在数据库中添加注册的信息 注册成功 
    存在的话注册失败 将结果封装在注册回复包发回客户端;  客户端收到回复包来显示”注册成功”或”注册失败”

    完成用户登录后 登录界面隐藏 文件列表界面显示
    这里用到了QT界面的tablewidget控件来显示当前用户所有的文件信息 以及上传下载文件的pushbutton按钮 供用户使用

    接下里项目的核心部分:上传文件 这一过程我们的客户端和服务器经历了三次交互 产生了四种情况
    文件正常上传 重复上传 秒传 断点续传
    前两次交互确定了上传类型 及上传的文件的相关信息
    最后一次交互根据上传类型去执行相应的方法来上传文件
    其中用到的技术包含MD5算法来判断文件是否在数据库中存在进而确定上传的类型,采用线程池模型来保证可以同时上传多个文件,
    用到list容器来存放任务 保证了我们的上传过程是非阻塞的;又用到auto关键字来定义迭代器 遍历list链表

    文件下载与上传大同小异 用到的技术相近 这里就不赘述了


    四、过程中的使用到的技术栈

    服务器:总共三个模块
    首先
    1.为了保证服务器的核心模块Kernel的唯一性,我们采用的是单例模式中的恶汉模式,为什么没有采用懒汉模式呢,因为懒汉模式是不支持线程安全的。我们为了保证数据传输过程中的安全可靠,因此然后开始分模块进行传输
    2.我当前采用的windowns下的服务器+客户端,如果要采用linux 只要把接口替换成linux的就可以使用
    3.网络采用的是面向连接的TCP协议,并且采用在包头加包长度的方法解决了粘包问题,
    4.为了保证接受的数据和发送的数据是一样多的,我自己自定义了一些协议包,比如注册包,登录包,上传下载文件包等,就相当于我们给服务器端和客户端自己设定了一些暗号,
    来使得我们自己更方便对于数据的一些操作。
    5.为了保证可以处理多个客户端,我们采用的是io模型中的异步事件的模型,也可以使用其他的,诸如select模型,异步选择模型,完成端口模型,其中效率最高的是完成端口模型,
    因为他是唯一一个windowns下的唯一的异步非阻塞 但步骤繁杂,考虑高并发 实时的前提下才使用完成端口,这个项目的要求并没有那么高,所以采用了异步通知、性能更优的异步事件模型,
    此外他的特点就是可以单线程处理多个套接字,这很契合网盘的需要。
    6.处理模块中还使用到了c++的一些容器,比如说map、list、queue等。数据库模块:建了很多表,比如说用户表user,文件表file,以及用户对应文件的映射表user_file,
    当有大量的用户以及文件时我们还可以采用数据库中的视图和索引来提高我们的操作以及查询的效率。


    客户端:
    也是三个模块 处理模块Kernel,网络模块INet、ui模块
    1.其中网络模块:也采用的是TCP协议 然后与之对应的也要有和服务器一样的协议包,因为就一个客户端,所以我们没有采用任何io模型。
    2.处理模块中也采用到了c++中的各种容器,这跟服务器里面的大题都是相似的。
    3.但是他没有数据库模块,因为用户只是对数据进行操作或者是查询的,用户任意的修改改变的都是服务器中的数据,也就真正存储到磁盘中的数据,所以并不用在用户中去管理数据
    4.但是他有ui模块,并在ui中多次使用了信号和槽的机制,以及文件在上传或者下载中还使用到了MD5算法去生成文件的唯一标识码,还包含的操作系统中的线程池模型,以便于我们可以同时上传多个文件,
    5.在线程池中,使用到了线程同步的技术。

    最后客户端和服务器还有一个心跳机制,要保证客户端和服务器之间的一个长连接,为了解决像客户端异常掉线这种在服务器不知道的异常情况下,客户端需要定时像服务器发送心跳包,
    保证和服务器是正常连接的,这个机制可以在应用层自己写,也可以使用传输层TCP自带的,应用层会比传输层更灵活,因为可以根据我们的需求自己去定义时间之类的条件。


    五、项目中的难点、遇到的一些问题

    对文件上传类型的判断  文件上传的断点续传  对文件IO使用不熟练  对QDialog、QFileDialog一些基础头文件以及函数的应用的掌握还不够


    六、解决方案

    1.在文件正常上传时  将上传的文件信息加入到上传文件列表 只有文件上传完成 才将文件从链表中移除
    判断时如果系统中存在当前文件 并且 上传文件列表中也存在当前文件 那么是断点续传
    2.采用TCP网络模型的机制 发送请求包回复包 采用pos变量记录文件偏移量,从偏移量处开始继续上传

    七、收获

    此项目充分锻炼我的对TCP网络模型以及异步事件IO模型的应用能力 对项目框架的搭建能力 对应用层协议的灵活定义及使用能力
    ; 熟悉了对文件读写的操作;更让我深刻理解了网络间服务器和客户端交互过程,通过这次项目,还是反省认识到了自己的知识储备不足,很多功能都没有头绪或者根本就没有这方面的思考,
    后面的路还很长,加油吧

  • 相关阅读:
    .NET企业应用安全开发动向-概览
    手撸mybatis07: SQL执行器的定义和实现
    123. 买卖股票的最佳时机 III
    React Native应用与优化
    一个.Net开发的轻量级SQLite数据库ORM
    【Redis】10.哨兵模式与分片集群
    OSCP系列靶场-Esay-Sumo
    wordpress网站搭建(centos stream 9)
    技术学习:Python(16)|lxml模块和Xpath(爬虫篇)
    同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
  • 原文地址:https://blog.csdn.net/m0_69414302/article/details/127171934