Python3 сокет не может отправить большой файл, а l oop выскакивает без причины - PullRequest
1 голос
/ 18 июня 2020

Это функция для отправки файла, параметрами которого являются имя файла и сокет. Перед отправкой файла он сгенерирует zip-файл, который будет удален после отправки.

При отправке небольших файлов (десятки килобайт) , ситуация нормальная, как показано ниже. При выходе из while l oop, условие оценивается как ложное

Нормальная ситуация, нажмите и посмотрите

Но при отправке файлов размером более 2МБ возникает такая ошибка : Файл не было отправлено, и условие по-прежнему выполняется, выскакивает l oop

Ситуация с ошибкой, щелкните и посмотрите

Более того , следующие две строки кода не выполняются

print("总共发送了%s个字节" % send_size)
print("Send:文件发送成功")

Почему l oop заканчивается внезапно, когда условие все еще выполняется? В результате файлы немного большего размера не могут быть переданы вообще.

Большое спасибо!

Исходный код :

    def file_send(self, conn, filename):
        true_name = filename
        filepath = self.host_path_list[filename]  
        # filepath is a URL 

        if filename.find('.') != -1:
            filename = filename[0:filename.find('.')] + ".zip"
        else:
            filename = filename + ".zip"

        z = zipfile.ZipFile(filename, 'w')

        if os.path.isdir(filepath):
            # If it is a subfolder, compress everything in filename.zip
            for d in os.listdir(filepath):
                z.write(filepath + os.sep + d, d)
        else:
            # It it is a single file
            z.write(filepath, true_name)
        z.close()

        header_dic = {
            'filename': filename,
            'file_size': z.infolist()[0].file_size
        }
        header_json = json.dumps(header_dic)
        header_bytes = header_json.encode('utf-8')

        conn.send(struct.pack('i', len(header_bytes)))

        # sender header
        conn.send(header_bytes)

        total_size = z.infolist()[0].file_size

        # sender data
        with open(filename, 'rb+') as f:
            send_size = 0
            while send_size <= total_size:
                data = f.read(1024)
                conn.send(data)
                send_size += len(data)
                print("已发送了:%s字节+ %s" % (send_size,(send_size <= total_size)))
            print("总共发送了%s个字节" % send_size)
            print("Send:文件发送成功")

        while True:
            try:
                os.remove(filename)
                break
            except:
                continue
...