上傳到服務器原理
商議客戶端將文件長度Length、文件名Name、Id文件id以協議的形式發送到服務器。服務器判斷Id是否為空,不為空時表示是斷點上傳,從存儲斷點上傳文件的數據庫中根據文件Id查詢文件保存的Path並將Path返回,根據Path從上次的歷史文件中讀取上傳的斷點位置(斷點位置記錄在臨時文件的*.log文件里的Properties部分了)
如果Id為空,則為初次上傳,生成id,將id和path添加到數據庫里
然后向客戶端發送協議頭Id(?包括記錄斷點位置的變量position,=0表示初次,=p表示斷點位置)並判斷是否傳輸完畢。傳輸完畢刪除數據庫中的記錄和臨時文件,沒有傳輸完畢繼續傳輸
文件上傳到客戶端:
原理:
客戶端從本地數據庫(數據庫包括文件本地路徑path,服務器返回的id)查詢有無上傳記錄有的話構造協議(文件長度、文件名字、id);沒有的話構造協議中id=null;socket請求返回字段id和position與如果第一次上傳返回服務器隨機生成唯一id里position=0就是第一次上傳,將(id,path)添加到數據庫;否則就是斷點續傳id=sourceid,position為上次上傳的歷史記錄位置,從position開始上傳並監視是否完成,上傳完成時刪除數據庫存儲的記錄,沒有上傳完成時繼續上傳。
下面是多線程下載
原理:
連接服務器獲取下載文件的大小,根據數據庫中存放的信息(id=下載路徑,Date=map(線程id,進度position))判斷文件是否已經存在。不存在,划分每個線程下載文件大小,啟動多線程下載;存在,從數據庫獲取每個線程已加載的長度。開始下載並監視,未完成,將每個線程已下載位置存放在數據庫;完成,結束