断点续传项目

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)

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'))

else:
client.send(str((filename,0)).encode('utf8'))

# 飞机头
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)
#
# break

bug1

你每次在服务端使用我们自定义的生成器读取10个字节的内容,在客户端接收时使用100个字节接收,但是同时增加100个字节,就会出现这个问题。你想:你每发送一次数据,客户端都会接收数据,但是你发送的是10个字节的数据,客户端接收100个字节的数据是能够接收完整,但是你却让他每次增加100个字节,对于1000字节数据的文件,客户端这边100*10次=1000就能接收完整,对于服务端却需要10*(10*10)字节=1000才能发送完整,因此你的断点续传是完成了,但是无法一次性接收所有文件的内容。
针对小文件,因为你一个服务端的while循环下来,可以把所有的数据提前发送出去,所以不会出现这个问题,也就是针对小于10*10=100个字节的数据不会出现这个问题。

原文地址:https://www.cnblogs.com/zrx19960128/p/11116230.html