这段代码下载了大部分文件,但并没有下载所有文件(在while循环内),我知道我在做什么错了吗?
data = csocket.recv(1024)
with open(filename, 'wb') as file_to_save:
while data:
file_to_save.write(data)
time.sleep(.008)
data = csocket.recv(1024)
if len(data) < 1024:
break
当下载38,616字节大小的文件时,此代码下载的长度大约为600个字节。
答案 0 :(得分:1)
通常,recv()函数不能保证返回您“请求”的字节总数。该参数只是您希望接收的最大字节数,但是如果缓冲区中有可用的字节,则该函数返回的字节数可以少于该字节数。这是https://docs.python.org/3/howto/sockets.html
的实现 def myreceive(self):
chunks = []
bytes_recd = 0
while bytes_recd < MSGLEN:
chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
if chunk == b'':
raise RuntimeError("socket connection broken")
chunks.append(chunk)
bytes_recd = bytes_recd + len(chunk)
return b''.join(chunks)
如您所见,该函数重复recv()直到期望的字节数到达为止。每个块到达后,新的recv()就会请求最大字节数MSGLEN – bytes_recd
。 min()用于将每个块的接收字节数限制为2048。recv()函数返回0字节(chunk == b'')时,意味着另一端关闭了连接。
对于您而言,len(data)
罐头a有时会返回小于1024的返回值。您的中断条件应为if len(data) < 1: