日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

项目实战:p2p文件下载器

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 项目实战: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文件下载器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。