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