云备份项目

项目链接

1. 项目介绍

客户端程序自动将本机指定文件夹下的文件备份上传,并且可以随时通过浏览器对备份文件进行查看及下载,其中下载过程支持断点续传功能,而服务器也会对上传文件进行热点管理,将非热点文件进行压缩存储,节省磁盘空间。

2. 功能模块划分

服务端功能:备份客户端上传的文件,对非热点文件进行压缩存储,节省磁盘空间,通过浏览器查看与下载文件,并且支持断点续传

服务端模块划分

  • (1). 配置管理模块:程序启动时,从配置文件中加载程序运行的关键信息
  • (2). 数据管理模块:内存中管理文件备份信息以及磁盘上持久化存储文件备份信息
  • (3). 热点管理模块:对长时间未访问的非热点文件进行压缩存储
  • (4). 网络通信模块:搭建 http 服务器实现网络通信,使用 httplib 库搭建
  • (5). 业务处理模块:处理客户端的文件上传、查看、下载(支持断点续传)请求,并响应结果

客户端功能:自动检测本机指定文件夹下的所有文件判断是否需要上传,并将需要上传的文件逐个上传

客户端模块划分:

  • (1). 数据管理模块:内存中管理上传文件信息以及磁盘上持久化存储上传文件信息
  • (2). 文件检测模块:检测指定文件夹下的所有文件是否有文件需要上传
  • (3). 网络通信模块:搭建 http 服务器实现网络通信,使用 httplib 库搭建

3. 预备工作

开发环境:ubuntu20.04/vscode、g++、gdb、makefile 以及 windows11/vs2022

安装 jsoncpp 库:使用 json 格式字符串对文件备份信息进行持久化存储

sudo apt update
sudo apt install libjsoncpp-dev
# 头文件: /usr/include/jsoncpp/json/
# 库文件: /usr/lib/x86_64-linux-gnu/
# 通过StreamWriterBuilder对象创建StreamWriter对象,然后调用writer进行序列化
# 通过CharReaderBuilder对象创建CharReader对象,然后调用parse进行反序列化

安装 bundle 库:对非热点文件进行压缩,对要访问但被压缩的文件进行解压

sudo apt install git
git clone https://github.com/r-lyeh-archived/bundle.git
# 使用时引入 bundle.h 和 bundle.cpp 即可
# string packed = bundle::pack(bundle::LZIP, body) 进行压缩,返回压缩后的内容
# string unpacked = bundle::unpack(body) 进行解压,返回解压后的内容

安装 httplib 库:搭建 http 服务器和客户端,使用 httplib 库可以免去搭建服务器和客户端的时间,将更多的精力投入到具体的业务中,提高开发效率

git clone https://github.com/yhirose/cpp-httplib.git
# 使用时引入 httplib.h 即可

当 httplib 收到一个客户端新建连接后,会将新的客户端连接抛入线程池中,线程池中线程会进行以下工作:

  1. 接收并解析请求,得到 Request 结构体
  2. 在 Handlers 映射表中,根据请求方法+资源路径查找处理函数,有则调用对应的处理函数,无则响应 404
  3. 根据处理函数返回的 Response 结构体中的数据组织 http 响应发送给客户端

Handlers 是一个请求路由数组,using Handlers = std::vector<std::pair<std::regex, Handler>>
regex:正则表达式,请求方法 + 匹配 http 请求资源路径,Handler:指针,指向用于完成请求处理的回调函数

搭建 http 服务器方法:

  1. 创建 httplib::Server 对象
  2. 调用 Server 对象中的 Get、Post 等方法注册处理函数到 Handlers(请求方法+资源路径 -> 处理函数),例如 Get(R"(/number/(\d+))", Number),针对 GET 请求的 “/number/任意数字” 设定处理函数为 Number
  3. 调用 Server 对象中的 listen 方法搭建并启动服务器

搭建 http 客户端方法:

  1. 创建 httplib::Client 对象
  2. 调用 Client 对象中的 Get、Post 等方法向服务器发送请求
// 向服务器发送 GET 请求,资源路径为 path
Result Get(const std::string &path);
// 向服务器发送 POST请求,提交多区域数据,常用于多文件上传
Result Post(const std::string &path, const MultipartFormDataltems &items);
// MultipartFormDataItems 是一个 MultipartFormData 数组
struct MultipartFormData {
	std::string name; // 客户端和服务器约定好的标识上传文件的字段
	std::string content;
	std::string filename;
	std::string content_type;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值