while True:
發出ls請求鏈接
client.send('ls'.encode('utf8'))
file_list = client.recv(1024)指針
print('請選擇文件下載:')
# 解壓縮出列表
file_list = eval(file_list.decode('utf8'))
for ind,val in enumerate(file_list):
print(ind,val)code
file_choice = input('請選擇你要的東西:')
filename = file_list[int(file_choice)]文檔
# 斷點續傳:查看客戶內已有的文檔大小和指針位置
file_path = os.path.join(settings.CLIENT_PATH,filename)
if os.path.exists(file_path):
file_size = os.path.getsize(file_path)
client.send(str((filename,file_size)).encode('utf8'))get
else:
client.send(str((filename,0)).encode('utf8'))input
# 飛機頭
file_head = client.recv(4)
file_head = struct.unpack('i',file_head)[0]
print(file_head)
#版本1:下載
recv_size = 0
while recv_size <= file_head:
file_content = client.recv(102400)
recv_size += 10240
print('recv_size', recv_size)
save_file_content(filename, file_content)
# 版本2:下載
# recv_size = 0
# while recv_size < file_head:
# if file_head - recv_size > 10240:
# file_content = client.recv(10240)
# save_file_content(filename, file_content)
# recv_size += 10240
# else:
# file_content = client.recv(file_head - recv_size)
# save_file_content(filename, file_content)
#
# breakcli
bug1file
你每次在服務端使用咱們自定義的生成器讀取10個字節的內容,在客戶端接收時使用100個字節接收,可是同時增長100個字節,就會出現這個問題。你想:你每發送一次數據,客戶端都會接收數據,可是你發送的是10個字節的數據,客戶端接收100個字節的數據是可以接收完整,可是你卻讓他每次增長100個字節,對於1000字節數據的文件,客戶端這邊100*10次=1000就能接收完整,對於服務端卻須要10*(10*10)字節=1000才能發送完整,所以你的斷點續傳是完成了,可是沒法一次性接收全部文件的內容。
針對小文件,由於你一個服務端的while循環下來,能夠把全部的數據提早發送出去,因此不會出現這個問題,也就是針對小於10*10=100個字節的數據不會出現這個問題。循環