项目实战:p2p文件下载器
项目背景
由于我在宿舍有一台笔记本一台台式电脑,两个电脑经常需要互传一些文件,但是每次插拔U盘就显得很不优雅了,遂打算自己开发一个用于面对面传输的软件。
项目环境
win10操作系统、VS2019、HTTP第三方库httplib、boost/filesystem
使用技术
网络传输、HTTP/TCP协议、多线程、分块传输、STL
项目结构图
具体实现介绍
项目使用介绍
项目启动后,会自动启动服务端和客户端程序,用户通过客户端可以获取连接自己局域网的主机列表,选择指定主机获取其存储文件,再通过文件名下载具体文件。
项目文件结构
client.hpp包含发送1、获取连接请求2、获取文件列表请求3、获取指定文件请求的设置
server.hpp包含设置响应上面请求的方法
tool.hpp包含使用boost库接口,针对于文件创建,访问,更改等。
httplib.h是建立客户端和服务端的库
main.cpp因为是全双工通信,通过多线程的方式同时启动客户端和服务端。
模块介绍
客户端
1.局域网通信模块
基于网卡信息的获取和IP地址的管理,获取到当前所在局域网中所有IP地址
2.网络通信模块
基于http协议使用httplib搭建客户端,实现向服务端发送配对/列表获取/下载请求
3.文件分块模块
基于线程池,实现下载文件时,将所有文件下载进行分块传输
服务端
1.网络通信模块
基于http协议使用httpliba搭建服务端,实现对客户端主机匹配/列表获取/下载请求 的反应
2.文件操作模块
基于boost库的文件操作,实现指定目录下的文件迭代获取和文件的读写
具体接口介绍
客户端
- 发送文件配对请求
void HostPair(Host* host)
- 使用cpp-httplib搭建客户端
- 发送一个配对请求
- 根据服务端返回的响应状态码,判断是否配对成功
- 获取在线主机列表请求
bool GetOnlineHost()
- 先获取本机网卡信息,根据本机网卡信息去验证所有可能存在本机网卡组成的局域网中的在线主机
- 向所有可能ip地址发送配对请求,将配对成功的ip地址放到在线主机列表中
- 打印在线主机列表,用户选择要进行文件传输的主机
- 检查是否存在下载目录,没有将创建一个
- 获取指定主机文件列表
bool GetShareList(const std::string& host_ip)
获取在线主机列表的桩模块,主机配对成功后,客户端会直接向服务端请求文件列表
- 使用cpp-httplib搭建客户端
- 向服务端发送获取文件列表请求
- 将服务端返回的 内容打印,供用户选择
- 下载文件请求
bool DownloadFile(const std::string& host_ip, const std::string& file_name)
对于小于100M的文件,内存放的下,所以直接传输即可
- 分块下载
bool RangeDownLoad(const std::string& host_ip, const std::string& file_name)
- 对大于100M的文件进行分块传输,设置http头部字段range,向服务端多次发送请求
- 服务端根据range字段,返回对应区域的文件数据
- 客户端将数据写入文件对应位置。
服务端
这三个接口都是根据客户端请求对应设计的,作用是填充一个response对象,然后将response对象的内容填充到http响应中,返回给客户端
- 主机配对,确保对端主机在线
static void HostPair(const httplib::Request& req, httplib::Response& rsp)
- 分享文件列表,发送文件列表
static void ShareList(const httplib::Request& req, httplib::Response& rsp)
- 发送需要下载的文件
static void DownLoad(const httplib::Request& req, httplib::Response& rsp)
其他
cpp-httplib的大致实现内容:
- server类中有一个路由表,通过meht&path:调用对应的回调函数
- 每次接受一个客户端请求,使用线程池,开启一个线程进行处理,解析请求,得到request对象,查找路由表调用回调函数
- 回调函数的作用,将信息填充到response对象,再组织一个http响应获取response对象信息回复给客户端
项目源码
gitee项目源码-面对面传输
项目实战:p2p文件下载器相关推荐
- [MAUI 项目实战] 音乐播放器(一):概述与架构
系列文章将分步解读音乐播放器核心业务及代码: [MAUI 项目实战] 音乐播放器(一):概述与架构 [MAUI 项目实战] 音乐播放器(二):播放内核 [MAUI 项目实战] 音乐播放器(三):界面交 ...
- 【实战项目】---P2P下载器
P2P下载器 1.引言 2.项目简介 3.整体框架 4.服务端设计 5.客户端设计 6.主要功能端口 7.httplib的处理流程: 8.源码 1.引言 在校期间经常需要进行给学委,班长拷贝文件.互传 ...
- 项目[P2P文件下载器]
项目介绍: 该项目完一个在局域网中进行附近文件共享下载功能的工具. 能够进行搜索匹配局域网中运行工具的主机,获取到局域网在线的主机列表 能够获取在线主机所共享的文件信息列表 能够对指定主机上的文件进行 ...
- 【Linux项目】 --P2P下载器的详细介绍
P2P下载器 一.P2P下载器功能简介 二.客户端功能细分 1.获取在线主机 1.1 获取网卡信息,得到局域网中的所有IP地址列表 1.2 逐个对IP地址列表的主机发送配对请求 1.3 配对得到响应, ...
- 【AI—pytorch学习】项目实战-单车预测器
Pytorch实战项目学习笔记--单车预测器 1.数据 原书中给出的地址好像有些问题或者被修改了,下载的数据与书中提到的数据不一致.查阅后可在 http://archive.ics.uci.edu/m ...
- Vue项目实战——音乐播放器
界面概览 体验地址 http://duing.site:888/MusicPlayer/#/discovery 源码已上传GitHub https://github.com/Du-ing/Vue_Mu ...
- [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构
这是一篇系列博文.请关注我,学习更多.NET MAUI开发知识! [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构 [MAUI 项目实战] 手势控制音乐播放器(二): 手势交互 [MAU ...
- P2P下载器(Linux下C++项目实战)
P2P下载器:即点对点下载器,服务端与客户端.服务端共享文件列表,客户端配对相应服务端,下载所需要的文件. 一.项目介绍 1.项目功能 搜索附近(局域网内)在线用户, 此处不足(只能在局域网内获取,需 ...
- spring p2p项目html,springboot2.x项目实战视频教程p2p金融中等项目
一.springboot项目如何部署到服务器 Springboot给我们的项目开发和项目部署带来很大的便利,至于如何部署到服务器上,其实我们有很多种办法,因为springboot中默认内嵌了tomca ...
最新文章
- 图解|2018年度中国科学十大进展
- 2.4 理解指数加权平均-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- 只因这个模型,它 1 年增长 44%,收入达 2.15 亿美元
- input输入框小写字母自动转换成大写字母
- uiuc计算机课程,UIUC计算机科学专业解读
- 计算机学院学生会宣传稿,计算机与信息工程学院学生会
- 【李宏毅2020 ML/DL】P85 Transfer Learning
- PDF转换为其他格式的方法
- linux系统编程:自己动手写一个ls命令
- Java开发实战经典【Java基础】
- 串口硬盘如何应用于并口硬盘计算机,并口硬盘和串口硬盘的区分与看图学习电脑硬盘的安装...
- MAC打开eclipse一直卡在core.ui的解决办法
- 路由器硬改+刷OpenWrt+挂载摄像头+U盘
- 核磁为什么要做ROI分析?
- mongodb数据库
- 地图编辑器开发(二)
- 外卖券-外卖优惠券-原生微信小程序
- Java打印101-150之间所有的质数
- 【转】最全前端面试问题及答案总结
- lol祖安服务器维护,触目惊心 被演员与代练所“支配”的英雄联盟
热门文章
- HTML5 向网页嵌入视频和音频
- oracle左外连接语法,Oracle 左外连接、右外连接、全外连接小总结
- mysql社工库搭建教程_社工库的搭建思路与代码实现
- Sublime Text3 无法调出package controll问题
- 那些深藏在记忆深处的片段 动漫篇 国外动漫部分(排名不分先后)
- 关于公共场合音频(抖音)外放现象的调查
- Glide获取网络图片宽高,并动态设置图片宽高
- cps配置之京东联盟篇
- m1 mac pd虚拟机运行win11 玩rpg游戏的流程及踩坑
- 4rx4 服务器内存2rx4_854596-B21 855507-091 32GB 2Rx4 PC4-2400T HPE服务器内存