此代码未按预期完全下载

问题描述 投票:0回答:2

此代码下载大部分文件,但不是全部文件(在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字节。

python python-3.x sockets file-sharing
2个回答
0
投票

尝试一下:

    data = csocket.recv(1024)   
    with open(filename, 'wb') as file_to_save:
        while True:
            file_to_save.write(data)
            time.sleep(.008)
            data = csocket.recv(1024)
            if not data:
                break

0
投票

通常,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)罐头将返回,有时返回小于1024。您的中断条件应为if len(data) < 1:

© www.soinside.com 2019 - 2024. All rights reserved.