• 云备份——服务器业务处理模块以及网络通信模块


    我们这里由于网络通信模块借助httplib库来完成,因此两个模块合并到一起完成,不熟悉httplib库的老铁可以再看看我之前的文章

    云备份——第三方库使用介绍(下)_爱吃鱼的修猫的博客-CSDN博客

    一,业务处理模块设计

    我们这里主要需要实现的功能有两个:1. 搭建网络通信服务器。2.服务器针对客户端的请求进行业务处理

    前者我们借助httplib实现,因此我们本模块的核心重点放到业务请求处理方向

    我们的业务请求处理主要是需要处理下面三个核心请求

    1. 文件上传请求:备份客户端上传的文件,并进行响应

    2. 文件列表请求:当客户浏览器申请文件列表或者默认资源路径请求,我们都响应备份文件信息列表,进行页面展示

    3. 文件下载请求: 通过展示页面,点击下载,响应客户端要下载的数据

     因此结合我们之前httplib库的使用案例,我们接口设计如下

    1. #ifndef _MY_SER_
    2. #define _MY_SER_
    3. #include "config.hpp"
    4. #include "data_manager.hpp"
    5. #include "hot_manager.hpp"
    6. #include "util.hpp"
    7. #include "httplib.h"
    8. namespace mjw_cloud
    9. {
    10. class Server
    11. {
    12. public:
    13. Server()
    14. {}
    15. bool Run()//服务器启动,并将响应的客户端请求和对应处理函数捆绑
    16. {}
    17. private:
    18. //注意回调函数都需要用static修饰成为静态成员函数,因为httplib库中函数要求的参数只有两个
    19. //类成员函数如果不用static修饰,那么会多出来一个this指针参数,httplib回调就会出错
    20. //上传文件
    21. static void UpLoad(const httplib::Request& req,httplib::Response& res);
    22. //备份文件信息展示
    23. static void ListShow(const httplib::Request& req,httplib::Response& res);
    24. //备份文件下载
    25. static void Dwonload(const httplib::Request& req,httplib::Response& res);
    26. private:
    27. int _server_port; // 端口号
    28. std::string _server_ip; // 服务器ip
    29. std::string _download_prefix; // 下载路径前缀
    30. httplib::Server _server; // httplib库搭建服务器
    31. };
    32. }
    33. #endif

    二,类初始化(构造函数以及Run函数)的实现

    网络通信接口设计,客户端和服务端是约定好的,客户端发送什么样的请求,服务端回复对应的响应

     三,业务处理接口实现

    3.1 文件上传请求

    如上图,是我们服务端上传文件时所用html页面,其对应核心报文如下所示

     观察其报文我们发现,主要内容里面不全是核心内容(也就是上传的文件),因此拿到报文后需要解析请求,然后拿到文件数据(httplib库完成),然后我们在将数据写入到文件存储起来,然后向客户端响应报文(主要是响应上传成功,因此返回状态码200即可)

    代码实现如下所示

    3.2 文件列表展示

    当客户浏览器申请文件列表或者默认资源路径请求,我们都响应备份文件信息列表,进行页面展示

     

    客户浏览器申请文件列表请求的报文如上所示

     

    我们服务端需要回复的报文如上所示,文本信息中的内容是需要我们根据备份文件信息进行填充,其他主要内容不变

    代码实现如下

    3.3 备份文件下载

    上面时客户端下载文件是发送的报文,下面是服务端响应时需要构建的报文

     

    其中Etags以及Accopt_Ranges见到的可能比较少

    Etags主要是作为文件唯一标识,当我们第一次发送文件时客户端会收到这个消息,当客户端第二次下载,会将这个标识发送给服务器,服务器会根据这个标识判断,这个资源如果没有被修改,则直接使用原先数据的缓存,无需从新下载。

    这里我们选择用"文件名-文件大小-文件最后一次修改时间"来组成这个唯一标识

    Accept-Ranges主要是断点续传会用到,后面会再说

    代码实现

    总结

    业务处理模块基本完成,但是备份文件下载还有断点重传的重要功能没有讲解,我们将放到后续进行讲解

  • 相关阅读:
    百分比组件
    深入理解Java虚拟机(第3版)学习笔记——Tomcat与OSGI中的类加载机制
    【Java集合类】之Map集合的特点及使用
    目标检测扩散模型DiffusionDet登场,扩散模型正在不同任务中“扩散”
    【HarmonyOS】HarmonyOS备案获取公钥和指纹
    详解FreeRTOS:系统时钟节拍(进阶篇—8)
    Yii2 引入 外部无命名空间的类,Class not found
    嵌入式笔试面试刷题(day15)
    system V共享内存【Linux】
    用MicroPython开发ESP32-文件传输工具-ampy
  • 原文地址:https://blog.csdn.net/zcxmjw/article/details/132702636