zoukankan      html  css  js  c++  java
  • 断点续传项目

    while True:
    发出ls请求连接
    client.send('ls'.encode('utf8'))
    file_list = client.recv(1024)

    print('请选择文件下载:')
    # 解压缩出列表
    file_list = eval(file_list.decode('utf8'))
    for ind,val in enumerate(file_list):
    print(ind,val)

    file_choice = input('请选择你要的东西:')
    filename = file_list[int(file_choice)]


    # 断点续传:查看客户内已有的文档大小和指针位置
    file_path = os.path.join(settings.CLIENT_PATH,filename)
    if os.path.exists(file_path):
    file_size = os.path.getsize(file_path)
    client.send(str((filename,file_size)).encode('utf8'))

    else:
    client.send(str((filename,0)).encode('utf8'))

    # 飞机头
    file_head = client.recv(4)
    file_head = struct.unpack('i',file_head)[0]
    print(file_head)
    #版本1:下载
    recv_size = 0
    while recv_size <= file_head:
    file_content = client.recv(102400)
    recv_size += 10240
    print('recv_size', recv_size)
    save_file_content(filename, file_content)

    # 版本2:下载
    # recv_size = 0
    # while recv_size < file_head:
    # if file_head - recv_size > 10240:
    # file_content = client.recv(10240)
    # save_file_content(filename, file_content)
    # recv_size += 10240
    # else:
    # file_content = client.recv(file_head - recv_size)
    # save_file_content(filename, file_content)
    #
    # break

    bug1

    你每次在服务端使用我们自定义的生成器读取10个字节的内容,在客户端接收时使用100个字节接收,但是同时增加100个字节,就会出现这个问题。你想:你每发送一次数据,客户端都会接收数据,但是你发送的是10个字节的数据,客户端接收100个字节的数据是能够接收完整,但是你却让他每次增加100个字节,对于1000字节数据的文件,客户端这边100*10次=1000就能接收完整,对于服务端却需要10*(10*10)字节=1000才能发送完整,因此你的断点续传是完成了,但是无法一次性接收所有文件的内容。
    针对小文件,因为你一个服务端的while循环下来,可以把所有的数据提前发送出去,所以不会出现这个问题,也就是针对小于10*10=100个字节的数据不会出现这个问题。

  • 相关阅读:
    redis基础配置
    brew安装mysql
    iptables 执行清除命令 iptables -F 要非常小心
    nginx反向代理部署nodejs配置
    Starting MySQL... ERROR! The server quit without updating PID file 问题解决
    iframe自适应高度问题
    js正则常用的一些东西
    node.js批量重命名文件
    [转]MySQL5字符集支持及编码研究
    PHP $_SERVER的使用
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/11116230.html
Copyright © 2011-2022 走看看