C++ 网络编程项目fastDFS分布式文件系统(八)--

目录

1 程序中的相关协议

1 程序中的相关协议

1. 注册
        客户端
// url
http: //127.0.0.1:80/reg
// post 数据格式
{
userName:xxxx,
nickName:xxx,
firstPwd:xxx,
phone:xxx,
email:xxx
}

服务器  

成功
{"code":"002"}
该用户已存在
{"code":"003"}
失败
{"code":"004"}

登录

        客户端

        

// url
http: //127.0.0.1:80/login
// post 数据
{
user:xxxx,
pwd:xxx
}

 服务器

        

§ 成功:
{
"code" : "000" ,
"token" : "xxx"
}
§ 失败:
{
"code" : "001" ,
"token" : "faild"
}
§ token 验证
® token 验证成功: { "token" : "110" }
® token 验证失败: { "token" : "111" }

 

3. 秒传
        客户端
        
# url
http: //127.0.0.1:80/md5
# post 数据格式
{
user:xxxx,
token:xxxx,
md5:xxx,
fileName: xxx
}

服务器

        

locationi / md5
{
fastcgi_pass 地址 : 端口 ;
include fastcgi.conf;
}

 

 

4. 上传
        客户端
                
# url
http: //127.0.0.1:80/upload
# post 数据格式
------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; user="mike"; filename="xxx.jpg"; md5="xxxx";
size=10240
Content-Type: text/plain
真正的文件内容 - 2G
------WebKitFormBoundary88asdgewtgewx--

客户端上传多个文件  

        

// 1. 上传多个文件 , 文件是一个一个处理的 , 处理第一个的时候其余的文件信息应该保存起来
/*
1. 需要一块内存 , stl, 队列 queue, vector/list( 首选 )
2. 将数据存储到队列 , 先进先出
操作 :
1. 往队列中放
2. 从队列中取
3. 将元素从队列中删除
4. 判断其是否为空
5. 清空队列
*/
class uploadTask
{
public :
void push ( FileInfo info );
FileInfo getItem ();
void delItem ( QString md5 );
void delItem ( FileInfo info );
bool isEmpty ();
void cleanQueue ();
private :
uploadTask ();
uploadTask ( const uploadTask & t );
queue < FileInfo > myqueue ;
}
// 任务队列中每一个任务的类型
struct FileInfo
{
QString filename ;
long fileSize ;
QString user ; // 文件所有者
QStirng md5 ;
}

服务器

        

// fastcgi 程序
1 成功
{"code":"008"}
失败
{"code":"009"}
5. 获取用户文件个数
url
http://127.0.0.1:80/myfiles?cmd=count
post 数据
{ "user": "kevin", "token": "xxxx" }
客户端
服务器 :
6. 从服务器获取文件信息
客户端
int main ()
{
while ( FCGI_Accept () >= 0 )
{
// 1. 读一次数据 - buf, 保证能够将分界线和两个头都装进去
char buf [ 4096 ];
// len == 实际读出的字节数
int len = fread ( buf , 1 , 4096 , stdin );
// 2. 跳过第一行的分界线
len = len - 第一行的长度
// 3. 将第二行中的 user, filename, md5, size 的值读出 -> 内存
len = len - 第二行的长度 ;
// 4. 跳过第 3
len = len - 第三行的长度
// 5. 跳过空行
len = len - 空行的长度 ;
// 6. 现在得到的位置的就是传输的真正数据的正文开始
// 7. 循环的将剩余的内容读出 , 有必要就写磁盘
// 8. 读完了 , 将最后的分界线剔除
// 9. 以上 8 步处理完毕 , 文件内容就被扣出来了
}
}

 

{
"num" : "270" ,
"code" : "110" // token 验证
}
§ token 验证
® token 验证成功: { "token" : "110" }
® token 验证失败: { "token" : "111" }
6. 从服务器获取文件信息
        客户端

 

服务器
        

 

 

{
"files" :
[
{
"user" : "yoyo" ,
"md5" : "e8ea6031b779ac26c319ddf949ad9d8d" ,
"time" : "2017-02-26 21:35:25" ,
"filename" : "test.mp4" ,
"share_status" : 0 ,
"pv" : 0 ,
"url" : "http://192.168.31.109:80/group1/M00/00/00/wKgfbViy2Z2AJ-FTAaM3As
g3Z0782.mp4" ,
"size" : 27473666 ,
"type" : "mp4"
},
{
"user" : "yoyo" ,
"md5" : "e8ea6031b779ac26c319ddf949ad9d8d" ,
"time" : "2017-02-26 21:35:25" ,
"filename" : "test.mp4" ,
"share_status" : 0 ,
"pv" : 0 ,
"url" : "http://192.168.31.109:80/group1/M00/00/00/wKgfbViy2Z2AJ-FTAaM3As
g3Z0782.mp4" ,
"size" : 27473666 ,
"type" : "mp4"
}
]
}
7. 下载文件之后 , 下载量 pv 字段的处理
                客户端
请求的 url: http://127.0.0.1:80/dealfile?cmd=pv
通过值请求更新数据库中该文件对应的下载量字段值
        
/* post 数据块 */
{
"user" : "yoyo" ,
"token" : "xxx" ,
"md5" : "xxx" ,
"filename" : "xxx"
}

 服务器

成功 : { "code" : "016" }
失败 : { "code" : "017" }
文件分享
        客户端
        
请求的 url
http: //127.0.0.1:80/dealfile?cmd=share
/* post 数据格式 */
{
"user" : "yoyo" ,
"token" : "xxxx" ,
"md5" : "xxx" ,
"filename" : "xxx"
}

 

服务器

        

成功 { "code" : "010" }
失败 { "code" : "011" }
别人已经分享此文件 { "code" : "012" }

         文件删除

                客户端

                

请求的 url
http: //127.0.0.1:80/dealfile?cmd=del
/* post 数据格式 */
{
"user" : "yoyo" ,
"token" : "xxxx" ,
"md5" : "xxx" ,
"filename" : "xxx"
}

服务器

        

成功 { "code" : "013" }
失败 { "code" : "014" }

 

10. 获取共享文件数目
        客户端
get 请求对应的 url
http: //127.0.0.1:80/sharefiles&cmd=count

 服务器

        # 服务器返回一个整形数

 共享文件信息

        客户端

        

请求的 url, 获取共享文件信息
http: //127.0.0.1:80/sharefiles&cmd=normal
/* post 数据格式 */
{
        "start" : 0 ,
        "count" : 10
}

 

服务器 
         # 数据格式参考获取文件列表
取消分享文件
客户端
        
请求的 url:
http: //127.0.0.1:80/dealsharefile?cmd=cancel

/* post数据块格式 */

{
"user" : "yoyo" ,
"md5" : "xxx" ,
"filename" : "xxx"
}
服务器
        
成功 { "code" : "018" }
失败 { "code" : "019" }
转存文件
客户端
        
请求的 url:
http: //127.0.0.1:80/dealsharefile?cmd=save

 

/* post 数据块格式 */
{
"user" : "yoyo" ,
"md5" : "xxx" ,
"filename" : "xxx"
}
服务器
        
成功 { "code" : "020" }
文件已存在 { "code" : "021" }
失败 { "code" : "022" }

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

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

相关文章

solidity0.8.0的应用案例13:数字签名及应用:NFT白名单

以太坊中的数字签名ECDSA,以及如何利用它发放NFT白名单 代码中的ECDSA库由OpenZeppelin的同名库简化而成。 数字签名 如果你用过opensea交易NFT,对签名就不会陌生。下图是小狐狸(metamask)钱包进行签名时弹出的窗口,它可以证明你拥有私钥的同时不需要对外公布私钥。 …

Shell基础_Shell概述及脚本执行方式

文章目录 1. Shell概述1.1 Shell是什么1.2 Shell的分类1.3 Linux支持的Shell1.4 总结 2. Shell脚本的执行方式2.1 echo输出命令2.2 第一个脚本2.3 脚本执行 1. Shell概述 1.1 Shell是什么 Shell是一个命令行解释器&#xff0c;它为用户提供了一个向Linux内核发送请求以便运行…

【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)

说明&#xff1a; 前端使用&#xff1a;vue3.0 前后端对接数据格式&#xff1a;无非就是前端把后端返回的数据处理为自己想要的格式&#xff0c;或者&#xff0c;后端给前端处理好想要的格式&#xff1b; 针对前后端的柱状图&#xff0c;趋势图等数据对接&#xff0c;前端一般需…

ModaHub魔搭社区:WinPin经营大脑助手

产品介绍 智慧经营助手:企业专属的“数据工程师”“BI分析师” WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分析模型 预测模型 决策模型 应用 精准预测

springboot整合第三方技术邮件系统

springboot整合第三方技术邮件系统&#xff0c;发邮件是java程序的基本操作&#xff0c;springboot整合javamail其实就是简化开发。不熟悉邮件的小伙伴可以先学习完javamail的基础操作&#xff0c;再来看这一部分内容才能感触到springboot整合javamail究竟简化了哪些操作。简化…

“R语言+遥感“水环境综合评价方法

详情点击链接&#xff1a;"R语言遥感"水环境综合评价方法 一&#xff1a;R语言 1.1 R语言特点&#xff08;R语言&#xff09; 1.2 安装R&#xff08;R语言&#xff09; 1.3 安装RStudio&#xff08;R语言&#xff09; &#xff08;1&#xff09;下载地址 &…

研磨设计模式day11代理模式

目录 场景 代码实现 ​编辑 解析 定义 代理模式调用示意图 代理模式的特点 本质 ​编辑何时选用 场景 我有一个订单类&#xff0c;包含订单数、用户名和商品名&#xff0c;有一个订单接口包含了对订单类的getter和setter 现在有一个需求&#xff0c;a创建的订单只…

Leetcode每日一题:1448. 统计二叉树中好节点的数目(2023.8.25 C++)

目录 1448. 统计二叉树中好节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1448. 统计二叉树中好节点的数目 题目描述&#xff1a; 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&…

机器学习实战之用 Scikit-Learn 正则化方法解决过拟合详解

你是不是在模型训练中遇到过这样的问题&#xff1a;在训练集上表现得极好&#xff0c;但在测试集上效果不佳&#xff1f;这就是过拟合的问题。 过拟合是模型在训练过程中学到了数据的“噪声”而非规律&#xff0c;导致在未知数据上表现不佳。那么怎么解决这个问题呢&#xff1…

计算机丢失msvcp110.dll是什么意思?有哪些方法可以修复

今天&#xff0c;我将和大家一起探讨一个关于计算机的问题——“计算机丢失msvcp110.dll是什么意思&#xff1f;有哪些方法可以修复&#xff1f;”这个问题在我们的日常生活中非常常见&#xff0c;尤其是在使用Windows系统的过程中&#xff0c;可能会遇到这样的问题。那么&…

ctfshow web入门 php特性 web108-web112

1.web108 strrev() 反转字符串 <?php echo strrev("Hello world!"); // 输出 "!dlrow olleH" ?> ereg 存在空字符截断(只会匹配%00前面的字符)&#xff0c;这个函数匹配到为true&#xff0c;没有匹配到为false,877为0x36d的十进制数值 payload: …

后端开发有哪几种语言? - 易智编译EaseEditing

后端开发是构建应用程序的一部分&#xff0c;负责处理服务器端的逻辑、数据库交互和数据处理。有许多编程语言可用于后端开发&#xff0c;以下是一些常见的后端开发语言&#xff1a; Java&#xff1a; Java是一种广泛使用的面向对象编程语言&#xff0c;具有强大的跨平台能力。…

哪款运动耳机好用、舒服的运动耳机推荐

如今&#xff0c;运动耳机已成为备受热捧的运动潮流单品&#xff0c;消费者对耳机的需求非常多元化。一款出色的运动耳机不仅要满足基本的运动需求&#xff0c;还需要具备丰富的功能&#xff0c;这直接决定了耳机的附加价值。接下来&#xff0c;我将向大家推荐5款佩戴舒适、牢固…

【C++】map的奇葩用法:和函数结合

2023年8月26日&#xff0c;周六下午 今天才发现map居然还能这样用... #include <iostream> #include <map> #include <functional>void printOne() {std::cout << "已经打印出1" << std::endl; }void printTwo() {std::cout <<…

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出&#xff1a;这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx&#xff08;源仓库名&#xff09;来切换不同的源地址 nrm use taobao…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…

SpringBoot+WebSocket搭建多人在线聊天环境

一、WebSocket是什么&#xff1f; WebSocket是在单个TCP连接上进行全双工通信的协议&#xff0c;可以在服务器和客户端之间建立双向通信通道。 WebSocket 首先与服务器建立常规 HTTP 连接&#xff0c;然后通过发送Upgrade标头将其升级为双向 WebSocket 连接。 WebSocket使得…

一个简单的web应用程序的创建

一个简单的web应用程序的创建 1、数据库设计与创建1.1、数据库系统1.2、Navicat Premium1.3、Power Designer2、使用maven创建SpringBoot项目2.1、配置maven2.2、安装idea2.3、使用idea创建maven项目2.4、根据需要配置pom.xml文件、配置项目启动相关的文件2.5、写SpringBoot项目…

darknet yolo make报错,缺少instance-segmenter.o的规则

文章目录 darknet yolo make报错&#xff0c;缺少instance-segmenter.o的规则报错原因解决办法新问题解决办法 补充g编译选项Makefile编译规则 darknet yolo make报错&#xff0c;缺少instance-segmenter.o的规则 报错原因 Makefile没有识别到对于instance-segmenter.o的编译…

匈牙利算法 in 二分图匹配

https://www.luogu.com.cn/problem/P3386 重新看这个算法&#xff0c;才发现自己没有理解。 左边的点轮流匹配&#xff0c;看是否能匹配成功。对右边的点进行记录是否尝试过 然后有空就进&#xff0c;别人能退的就进 遍历左部点&#xff1a; 尝试匹配过程&#xff1a;