開發一個支援多使用者線上的FTP程式
阿新 • • 發佈:2020-09-14
一、專案需求:開發一個支援多使用者線上的FTP程式
1)、基礎需求:75%
1. 使用者加密認證
2. 允許多使用者登入
3. 每個使用者都有自己的家目錄,且只能訪問自己的家目錄
4. 對使用者進行磁碟分配,每一個使用者的可用空間可以自己設定
5. 允許使用者在ftp server上隨意切換目錄
6. 允許使用者檢視自己家目錄下的檔案
7. 允許使用者上傳和下載,保證檔案的一致性
8. 檔案上傳、下載過程中顯示進度條
2)、升級需求:10%
1. 檔案支援斷點續傳
二、功能實現 1. 使用者加密認證 server端,使用者註冊密碼後,明文發給服務端,服務端md5對密碼加密後儲存 使用者每次登陸的密碼,服務端都md5加密後與資料庫的值進行匹配。功能實現2. 允許多使用者登入 client端,斷開連線後,客戶端程式不退出。等待其他使用者接入。 server端,持續執行,不主動斷開。 3. 每個使用者都有自己的家目錄,且只能訪問自己的家目錄 4. 對使用者進行磁碟分配,每一個使用者的可用空間可以自己設定 client端,連線服務端後,註冊使用者。收集使用者名稱,密碼,磁碟空間 server端,收到使用者名稱,密碼,磁碟空間後,給使用者建立家目錄,並記錄家目錄空間大小設定。 server端,儲存使用者名稱,密碼,磁碟空間,家目錄路徑到account.py。 server端,對於所有涉及路徑的指令,執行之前,檢查路徑是否在家目錄之內,超出家目錄的不執行 server端,對於所有涉及檔案儲存的指令,執行之前,檢查家目錄剩餘空間,空間不夠不執行5. 允許使用者在ftp server上隨意切換目錄 _cd 命令:_cd "dst_dir" client端,get_cmd 方法蒐集使用者指令,根據cmd找到cd,cd方法得到head_dic,交給handler_send 傳送資料。handler_recv接收server的執行回執,並列印結果 server端,handler_recv 方法接收資料,拿到head_dic和cmd,order_handler根據cmd找到cd,cd 方法的到res_head_dic,交給handler_send傳送資料 server.mt方法:server類下儲存類屬性,dir_info字典裡頭儲存當前路徑,和家目錄路徑。收到使用者的dst_dir之後,改變dir_info中的current_dir的值。6. 允許使用者檢視自己家目錄下的檔案 server端,server類下儲存類屬性,dir_info字典裡頭儲存current_dir和home。使用者登入之後,會繫結使用者家目錄路徑給dir_info['home'] 使用者輸入dir home 就會顯示家目錄下的檔案。輸入dir 就會顯示current_dir下的檔案。 7. 允許使用者上傳和下載,保證檔案的一致性 client端,通過get_md5_file方法對檔案進行校驗,得到hash值 server端,通過get_md5_file方法對檔案進行校驗,得到hash值,與client端的值進行比較,返回結果。不相等需要重發。 send_file方法:client端,獲取src_file,和dst_file。src_file必須輸入並且檔案存在。dst_file預設是,預設儲存到server家目錄下的download資料夾下 傳送dic,包括,cmd,src,dst,filename,size,file_hash。函式發現有size,進一步傳送檔案。 收取server端發來的執行結果。 server端,收到dic,發現有size,就進一步接收檔案,先校驗磁碟空間,在校驗dst路徑(合法,存在),最後校驗hash 處理完畢後,返回執行結果給client端。 get_file方法:client端,獲取src_file,和dst_file。src_file必須輸入。dst_file預設時,預設儲存到client的data下 傳送dic包括,cmd,src,dst,filename, 收取server端傳送來的dic,列印res。 發現有size,進一步接收檔案,先校驗dst是否存在,接收完畢後校驗hash值是否一致。 server端,收到dic,根據cmd交給,get_file去處理,先驗證src路徑(合法,存在),然後得到file_hash和size。 傳送dic, 包括res,src,dst,filename,size,file_hash。函式發現有size,進一步傳送檔案。 8. 檔案上傳、下載過程中顯示進度條 view_bar方法:client端傳送檔案時,根據send_size,和file_size來顯示進度。client端接收檔案時,根據recv_size 和 file_size來顯示進度