• 5
  • 新人请关照

python3 socket编程传不了大文件,while循环无故终止

下面是一个发送文件的函数,传输参数是文件名和socket
生成一个压缩包,完成压缩包的发送之后再将生成的压缩包删掉。
在发送一些小的文件(几十kb)的时候是正常的,如下图
image.png



退出while循环时会判断条件为false(正常)
但是在发送2MB以上的文件,就会这样
image.png
还没发送完,条件依然是true的时候,就跳出了
且后面的

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

都没有执行。
为什么在条件还是true的时候,就突然跳出去了呢?

    def file_send(self, conn, filename):
        true_name = filename
        filepath = self.host_path_list[filename]  
        # filepath相当于一个URL 

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

        z = zipfile.ZipFile(filename, 'w')
        # 新建一个zip对象

        if os.path.isdir(filepath):
            # 如果查询的是子文件夹 就把里面所有的东西压缩进filename.zip
            for d in os.listdir(filepath):
                z.write(filepath + os.sep + d, d)
        else:
            # 找到是文件 只用压一个就行了
            z.write(filepath, true_name)
        z.close()

        # 将头部信息封装成json 再编码成bytes
        header_dic = {
            'filename': filename,
            'file_size': z.infolist()[0].file_size
        }
        header_json = json.dumps(header_dic)
        header_bytes = header_json.encode('utf-8')

        # 打包文件头
        # 把header的长度封装成元组
        conn.send(struct.pack('i', len(header_bytes)))

        # 发送头
        conn.send(header_bytes)

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

        # 发送数据
        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
阅读 311
评论
    0 个回答
    撰写回答

    登录后参与交流、获取后续更新提醒

    相似问题
    推荐文章