绝尘韫玉 2020-06-18 19:29 采纳率: 0%
浏览 163

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
  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。