需求分析
1. 多用戶同時登陸
2. 用戶登陸,加密認證
3. 上傳/下載文件,保證文件一致性
4. 傳輸過程中現實進度條
5. 不同用戶家目錄不同,且只能訪問自己的家目錄
6. 對用戶進行磁盤配額、不同用戶配額可不同
7. 用戶登陸server后,可在家目錄權限下切換子目錄
8. 查看當前目錄下文件,新建文件夾
9. 刪除文件和空文件夾
10. 充分使用面向對象知識
11. 支持斷點續傳
流程圖
代碼准備
字符串操作以及打印 —— 實現上傳下載的進度條功能

def processBar(num, total): rate = num / total rate_num = int(rate * 100) if rate_num == 100: r = '\r%s>%d%%\n' % ('=' * rate_num, rate_num,) else: r = '\r%s>%d%%' % ('=' * rate_num, rate_num,) sys.stdout.write(r) sys.stdout.flush
socketserver —— 實現ftp server端和client端的交互

import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): conn = self.request conn.sendall(bytes('歡迎致電 10086,請輸入1xxx,0轉人工服務.',encoding='utf-8')) Flag = True while Flag: data = conn.recv(1024).decode('utf-8') if data == 'exit': Flag = False elif data == '0': conn.sendall(bytes('通過可能會被錄音.balabala一大推',encoding='utf-8')) else: conn.sendall(bytes('請重新輸入.',encoding='utf-8')) if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1',8008),MyServer) server.serve_forever()

import socket ip_port = ('127.0.0.1',8008) sk = socket.socket() sk.connect(ip_port) sk.settimeout(5) while True: data = sk.recv(1024).decode('utf-8') print('receive:',data) inp = input('please input:') sk.sendall(bytes(inp,encoding='utf-8')) if inp == 'exit': break sk.close()
struct模塊 —— 自定制報頭解決文件上傳下載過程中的粘包問題

import json,struct #假設通過客戶端上傳1T:1073741824000的文件a.txt #為避免粘包,必須自定制報頭 header={'file_size':1073741824000,'file_name':'/a/b/c/d/e/a.txt','md5':'8f6fbf8347faa4924a76856701edb0f3'} #1T數據,文件路徑和md5值 #為了該報頭能傳送,需要序列化並且轉為bytes head_bytes=bytes(json.dumps(header),encoding='utf-8') #序列化並轉成bytes,用於傳輸 #為了讓客戶端知道報頭的長度,用struck將報頭長度這個數字轉成固定長度:4個字節 head_len_bytes=struct.pack('i',len(head_bytes)) #這4個字節里只包含了一個數字,該數字是報頭的長度 #客戶端開始發送 conn.send(head_len_bytes) #先發報頭的長度,4個bytes conn.send(head_bytes) #再發報頭的字節格式 conn.sendall(文件內容) #然后發真實內容的字節格式 #服務端開始接收 head_len_bytes=s.recv(4) #先收報頭4個bytes,得到報頭長度的字節格式 x=struct.unpack('i',head_len_bytes)[0] #提取報頭的長度 head_bytes=s.recv(x) #按照報頭長度x,收取報頭的bytes格式 header=json.loads(json.dumps(header)) #提取報頭 #最后根據報頭的內容提取真實的數據,比如 real_data_len=s.recv(header['file_size']) s.recv(real_data_len)
hashlib模塊 —— 實現文件的一致性校驗和用戶密文登錄
os模塊 —— 實現目錄的切換及查看文件文件夾等功能
文件操作 —— 完成上傳下載文件及斷點續傳等功能
面向對象編程思想+繼承知識 —— 組織簡化代碼
采分點:
第一周:完成1-4需求
1.實現文件的上傳、下載功能 30分
2.實現c/s端 密文登陸功能 20分
3.有效處理大文件 10分
4.md5進行文件已執行校驗 10分
5.實現進度條功能 10分
6.充分使用面向對象的知識 10分
7.目錄結構、流程如和readme 10分
第二周:
上周作業基礎40分
基於上周作業,每實現一個新功能10分。