最近乙個多月一直在弄檔案傳輸的元件。最近也有個基本的樣子了,這裡算是乙個簡單總結吧。
檔案傳輸底層使用開源的c++通訊元件hp-socket(pullserver,pullclient)。感興趣的可以搜一下。
廢話不多說,進入正題
首先,所有的客戶端必須首先登陸伺服器,在伺服器進行註冊,在伺服器端維護乙個客戶端標識與客戶端資訊的對映關係,比如客戶端資訊類clientinfo。
//則服務端,就需要有這樣乙個類似dictionary的字典。在客戶端a給客戶端b**資料的時候,可以從這個對映關係中找到對方。**片段
clientinfo
登入過程
在客戶端登入成功後,就可以傳送檔案了。
包頭資訊說明
transferid:傳輸id,標識在同時傳輸多個檔案時,是不同的傳輸。
transfertype:傳輸型別
transfercommand:傳輸命令
md5:檢驗值(md5或者hash,越短越好,演算法越快越好)
filename:檔名。
filerelativepath:傳輸資料夾時用到,資料夾中的檔案,需要用到相對路徑,接收端根據接收路徑+相對路徑進行儲存資料夾中的檔案。
size:檔案或者資料夾總大小,將總大小拋給應用層,計算傳輸速度。
currendindex:當前傳輸包的索引,也是讀取檔案第幾個包的索引。
pkgcount:總共多少個包。接收端可以根據當前索引和包總數,來判斷是否傳輸完成,或者在斷點續傳的時候用到。
from:傳送端標識
to:接收端標識
bodysize:每次傳輸的body大小。
自定義協議
固定包頭+body
每次包都要遵循該協議,伺服器收到包後,要進行解析,根據包頭中bodysize取出這次的資料data。
斷點續傳
在接收端,每次接收到包,寫入檔案的同時,將包頭資訊寫入本地檔案(ini也好,xml檔案也好)。然後傳送端,再次傳送該檔案的時候,首先會傳送請求包,接收端根據該檔案的包頭資訊和ini檔案中的資訊,比對md5是否相同,傳送方是否相同,如果相同,則將currentindex+1,響應給傳送端。傳送端就可以直接從currendindex+1的位置繼續讀取檔案包進行傳送。
該元件前前後後大概乙個多月,裡面業務比較複雜,需要考慮的到的東西還是比較多的,目前實現,同時傳輸多個檔案,多個資料夾,斷點續傳功能。但多檔案和多資料夾同時混合傳送仍有問題。還有客戶端a給客戶端b傳送檔案的同時,客戶端b給客戶端a傳送,仍有問題。
通過該元件的設計,也收穫不小,對業務能力也是一種考驗。對tcp通訊有了更深入的學習。
本文只是分享一下思路,感興趣的可以搜一下hp-socket。
XMPP之檔案傳輸報文
最近在做檔案傳輸,遇到只能傳送檔案到spark,spark傳送檔案來不能接收,要麼一直等待,要麼發一下就要重試,這天終於找到問題的所在了 我的openfire裡面的 伺服器 伺服器設定 檔案傳輸設定 裡面的 服務被禁用了,應該要使用裡面的 使用 這是我同學總結分析出來的傳輸檔案的報文,由於我們兩個是...
VC檔案傳輸
vc 檔案傳輸的實現 2008 07 20 20 33 要實現檔案傳輸最簡單的辦法是寫兩個執行緒,乙個伺服器段的傳送處理執行緒,乙個客戶端的接收處理執行緒。執行緒處理函式需要宣告為類的靜態成員,由於不可訪問類內部的資料成員,所以引數傳遞裡面最好有個類的指標 伺服器段的傳送處理執行緒 cfiletra...
簡單檔案傳輸
原理 檔案傳輸的原理其實很簡單,服務端先在某個埠監聽,等待客戶端的連線,連線成功後,服務端開啟指定的檔案,然後讀取檔案,再通過建立的套接字傳送給客戶端。如果要實現乙個服務端能與多個客戶端連線,則需要用到多執行緒,下面給出一對一的實現 有興趣的朋友可以用多執行緒實現一對多。程式 include inc...