绝尘韫玉 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 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛