P2P Downloader

P2P Downloader , 固然就是 P2P 下載器了 , 就是和 比特精靈 差很少的那種 。  ^ ^  html

不過這個項目沒有代碼 , 懶得寫代碼了 , 就文字描述一下吧 。   ^ ^服務器

 

P2P 下載呢 , 主要就是把要下載的文件 分割 爲一個一個的 數據塊(Data Block), 假設咱們定義每一個 數據塊 是 1K , 假設要下載的文件是 1M , 那麼就會分割成 1024 個 數據塊 。 接下來再把 數據塊 封裝成 數據包(Data Packet) , 數據包 固然要包含 數據塊 , 除此之外 , 還會包含 頭(Head) , 頭裏會包含一些數據塊的信息 ,好比 數據塊的序號(Seq no) , 就是 第幾個數據塊 , 這是 客戶端 接收到 數據塊 把 數據塊 拼成文件時 須要的,還有就是 數據塊 的 長度 , 由於若是一個文件的 大小 小於 數據塊 的 標準大小 , 那麼 數據塊 的 長度 就會小於 標準大小 。 或者 數據塊 是 最後一個數據塊 , 那麼一樣也可能 長度 小於 標準大小 。  網絡

 

頭的信息主要就這 2 項 。 準備好數據包之後 , 就能夠下載了 , 客戶端 只要 把 數據包 下載下來 , 根據 序號(Seq no) 拼成一個文件就能夠 。htm

 

固然 , 對於 P2P 而言 , 每一個 客戶端 也是 服務器 。blog

 

那麼 ,客戶端 怎麼知道去哪裏下載呢 ? 剛開始的時候 。 這就是 「發佈種子」 和 「作種」 的 問題 啦 。get

 

P :  我不太喜歡 「作種」 這個詞 , 但又想不到其它的詞來描述 , 就先用着了 。class

 

種子是什麼呢 ? 就是要下載文件的 數字摘要 , 也能夠說是 Hash 值 。 用於標識 這個文件 。 客戶端 下載到 數據包 能夠根據這個 Hash 值來確認 數據包 是不是這個文件的 。 哦 , 這樣的話 , 數據包 的 頭裏還要增長一項 , 就是這個 Hash 值 。下載

另外, 種子 裏 還須要包含 作種 的 服務器 地址(IP 端口), 這個 服務器 就是 客戶端 訪問的 第一個 服務器 。 從這個 服務器 上 , 客戶端 能夠獲取到 其它的 服務器節點(其它正在下載的客戶端) , 這樣 客戶端 就能夠從 多個 服務器 節點 下載 數據包 , 拼成一個文件 。 從每一個 服務器節點 上 , 客戶端 又能夠獲取 這些 服務器節點 知道的 服務器節點 , ……    而後 。請求

 

因此 , 這就是 種子文件 , 種子文件 發佈出來之後 , 服務器 就開始 「作種」 , 就是上面說的 , 按照 種子文件 裏 提供的 服務器地址 監聽 , 監聽到 客戶端 請求 , 能夠給 客戶端 返回 數據包 和 服務器節點列表(其它正在下載的 客戶端)。  通信

 

而後 , 就是這樣了 。

 

按照這個邏輯能夠寫 P2P Downloader , 其中 網絡通訊 (遠程通訊 RPC) 的部分 , 能夠用 MessageRPC 。 MessageRPC 是我寫的另外一個項目 :  http://www.javashuo.com/article/p-shoqpprt-bv.html    

相關文章
相關標籤/搜索