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

news2024/11/16 23:33:02

目录

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.coloradmin.cn/o/933639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql45讲学习笔记

前言&#xff1a;这篇文章主要总结事务&#xff0c;锁、索引的一些知识点&#xff0c;然后分享一下自己学习小心得&#xff0c;我会从点到线在到面展开说说&#xff0c;对于学习任何知识&#xff0c;我们都应该藐其全貌&#xff0c;不要一开始就选入细节 基础 一、基础架构&a…

4.Redis数据类型的编码方式

数据结构和内部编码 type 命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列表&#xff09;、hash&#xff08;哈希&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序…

kali安装Hashpump(简单无比)

安装 OpenSSL 开发库&#xff1a; sudo apt-get update sudo apt-get install libssl-dev克隆 Hashpump 仓库 git clone https://github.com/bwall/HashPump.git进入 HashPump 目录 cd HashPump编译并安装 Hashpump make sudo make install使用 Hashpump 工具&#xff1a; …

OLED透明屏拼接:创造更大尺寸的显示区域,提供更广阔的视觉体验

OLED透明屏拼接是一项创新技术&#xff0c;可以实现更大尺寸的显示区域和更加连续和流畅的画面效果&#xff0c;为广告、商场、零售、智能家居等领域提供更多的创意和可能。 下面将详细介绍OLED透明屏拼接的原理、优势、应用领域&#xff0c;希望看后对您了解OLED透明屏有所帮…

WPF怎么实现文件拖放功能winform怎么实现拖拽功能

WPF怎么实现文件拖放功能winform怎么实现文件拖拽功能&#xff0c;在管理员模式下wpf winform怎么实现文件的拖拽功能 WPF实现文件拖放功能&#xff0c;正常情况并没有什么问题&#xff0c;但是如果你的程序使用管理员身份启动&#xff0c;你就会发现文件拖放功能就会失效。同…

捕鱼船识别检测算法

捕鱼船识别检测预警系统通过yolov5python网络模型图像识别分析技术&#xff0c;捕鱼船识别检测预警算法利用河道两岸的摄像头实时监测水域中的捕鱼船活动&#xff0c;一旦系统识别到违规捕捞行为&#xff0c;立即发出预警信号&#xff0c;立即发出预警信号&#xff0c;确保及时…

Abaqus软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Abaqus是一款专业的有限元分析软件&#xff0c;广泛应用于工程领域&#xff0c;特别是机械、汽车、航空航天、材料科学等领域。它具有强大的有限元分析功能&#xff0c;可以模拟各种复杂的物理和力学问题&#xff0c;为工程师提…

openCV实战-系列教程8:直方图与傅里叶变换(直方图定义/均衡化原理/均衡化效果/傅里叶概述/频域变换结果/低通与高通滤波)、原理解析、源码解读

打印图像直接用这个函数&#xff1a; import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()1、直方图 1.1 基本定义…

开源软件的崛起:历史与未来

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

image.png 背景 前段时间我们想实现 Pulsar 消息的追踪流程&#xff0c;追踪实现的效果图如下&#xff1a; 实现其实比较简单&#xff0c;其中最重要的就是如何存储消息。 消息的读取我们是通过 Pulsar 自带的 BrokerInterceptor 实现的&#xff0c;对这个感兴趣的朋友后面会单…

Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) A ~ D

比赛链接 A 正常枚举就行&#xff0c;从最后一位往前枚举&#xff0c;-1、-2、-3...这样 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long l…

开源软件的可访问性:让技术更加包容

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Pico如何使用C/C++选择哪个I2C控制器,以及SDA和SCL针脚

本文一开始讲述了解决方案&#xff0c;后面是我做的笔记&#xff0c;用来讲述我的发现流程和探究的 Pico I2C 代码结构。 前提知识 首先要说明一点&#xff1a;Pico 有两个 I2C&#xff0c;也就是两套 SDA 和 SCL。这点你可以在针脚图中名字看出&#xff0c;比如下图的 Pin 4…

【CHI】(十四)Link Handshake

1.Link layer Credit 本节介绍了链接层信用证&#xff08;L-Credit&#xff09;机制。信息通过使用L-Credit在接口通道传输。要将一个flit从 Transmitter传输到Receiver&#xff0c;Transmitter必须获得L-Credit。 1.1L-Credit flow control 通过将LCRDV信号置起&#xff0c;…

聊聊近况,一个字【累】

首发博客地址 https://blog.zysicyj.top/ 1 最近生活状态真的是一团糟呀&#xff0c;我们家是承包了二十亩葡萄园的&#xff0c;但是只有我爸妈忙活&#xff0c;今年还好我小舅在这边帮忙&#xff0c;不然我的时间还要被压缩的更厉害&#xff0c;写博客学习那肯定是不敢想的了。…

MacOS goland go1.21 debug问题

安装dlv brew install dlv 安装之后在终端会显示所在目录 类似/usr/local/Cellar/delve/1.21.0/bin 配置goland 在文件系统中找到goland 右击选择show package contents -> Contents -> plugins -> go 尝试替换 其中对应系统 的 dlv 结果还是不行 然后打开应用gol…

汤普森采样(Thompson sampling): Beta分布直观理解(可视化)

本文是博客《汤普森采样(Thompson sampling):理论支持》得附录&#xff0c;进一步理解直观理解Beta分布。 1、曝光(αβ)比较大&#xff0c;且点击(α)比较好的情况&#xff0c;可见现在返回的值大部分在0.8左右。 2、曝光(αβ)比较大&#xff0c;且点击(α)比较小的情况&am…

C++数据结构学习——栈

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈二、C语言实现1.声明代码2.实现增删查改代码3.测试代码 总结 前言 栈&#xff08;Stack&#xff09;是计算机科学中一种常见的数据结构&#xff0c;它是…

系统架构设计、Linux、 C++、Java、Python、Andorid、iOS等技术笔记目录分享 - 最全讲解

架构设计师应具备的专业素质&#xff1a; 掌握业务领域的知识、掌握技术知识、掌握设计技能、掌握编程技能、具备沟通能力、具备决策能力、知道组织策略、应是谈判专家。 →点击 笔者主页&#xff0c;欢迎关注哦&#xff08;互相学习&#xff0c;共同成长&#xff09; 笔者看…

Linux网络编程:Web服务器

文章目录&#xff1a; 一&#xff1a;超文本编辑语言HTML 二&#xff1a;HTTP超文本传输协议 1.请求和响应消息流程 myhttpd.c getline函数,&#xff1a;用于读取http协议头 2.错误 2.1 处理出错返回disconnect 2.2 错误页面展示send_error 3.写出http应答协议头 写…