No.4 文件断点续传(Client)

import socket, json, struct, hashlib, os, shutil
codes = {
    "文件已存在":1001,
    "文件不存在":1002
}

‘‘‘

后开始

1.接收字典的长度;

2.利用字典的长度来接收字典(FileName,File_md5值,FileSize)

3.利用File_md5值判断需下载的文件是否存在。(若存在,则需要续传)

4.若文件已存在发送字典(Code,FileSize)

若文件不存在发送字典(Code,FileSize(0))

5.若文件已存在,接收文件.并且续写进文件中.

若文件不存在,接收文件.并且写入文件中.

7.校验完整性

8.将md5的值改成FileName

‘‘‘

File_path = r‘E:\Python\OldBoy\Mycode\Day3\FTP断点续传\dengfei\Home‘ # 下载至
client = socket.socket()
client.connect(("127.0.0.1",8080,))

def handle(client):
    File_info_lenth = struct.unpack("i",client.recv(4))[0]
    File_info = json.loads(client.recv(File_info_lenth).decode("utf-8"))

    FileName = File_info["FileName"]
    FileSize = File_info["FileSize"]
    md5_val = File_info["md5_val"]

    Md5_Path = os.path.join(File_path,md5_val)
    FileName_path = os.path.join(File_path,FileName)
    if os.path.exists(Md5_Path):
        Md5_Size = os.path.getsize(Md5_Path)
    else:
        Md5_Size = 0
    response = {
            "Code":None,
            "Md5_Size":None
        }
    if os.path.exists(Md5_Path):
        response["Code"] = 1001
        response["Md5_Size"]  = Md5_Size
    else:
        response["Code"] = 1002
        response["Md5_Size"] = 0

    client.send(json.dumps(response).encode("utf-8"))

    client.send(recevie(Md5_Path,Md5_Size,FileSize).encode("utf-8"))

    result = client.recv(1024)

    if result == b‘200‘:
        shutil.move(Md5_Path,FileName_path)
        print("文件完整!")

    elif result == b‘404‘:
        print("文件异常!")
    else:
        print("未知错误!")

def recevie(Md5_Path,Md5_Size,FileSize):
    recevie_data = 0
    recevie_length = Md5_Size
    md5 = hashlib.md5()
    with open(Md5_Path, ‘ab‘) as f:
        while recevie_length < FileSize:
            data = client.recv(1024)
            f.write(data)
            recevie_length += len(data)
            md5.update(data)
            val = int(recevie_length / FileSize * 100)
            print(‘\r%s%%|%s‘ % (val, "#" * val,), end=‘‘)
    print("")

    return md5.hexdigest()

def run(client):
    handle(client)

run(client)

原文地址:https://www.cnblogs.com/deng-fei/p/11271934.html

时间: 2025-01-22 10:53:57

No.4 文件断点续传(Client)的相关文章

java文件断点续传的简单实现

一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content-Range实体头.HTTP协议本身不支持断点上传,需要自己实现. 二.Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始.典型格式: Ranges:    (unit=

Flash大文件断点续传功能

一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content-Range实体头.HTTP协议本身不支持断点上传,需要自己实现. 二.Range 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始.典型格式: Ranges:    (unit=

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

HTML5 大文件断点续传完整思路整理

需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持断点续传,关闭浏览器或刷新浏览器后仍然能够保留

文件上传控件-如何上传文件-大文件断点续传

需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Windows,Mac,Linux 支持所有浏览器. 支持文件批量上传 支持文件夹上传,且要求在服务端保留层级结构.文件夹数量要求支持到10W. 支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传.文件大小要求能够支持到20个G. 支持自动加载本地文件,要求能够自动加载指定的本地文件.

HTTP文件断点续传的原理

前几天一个同事跑过来找我说,我们在广告素材视频这块想做断点续传,就是这次某个视频缓存到一半,下次不用重头开始,可以在原来停留得位置开始继续下载.以提供更好的用户体验. 同时说需要我们支持吐素材地址的业务接口告诉终端最后修改时间/文件签名(md5),用这个用来判断我当前要下的文件有没有变化,同时告诉终端文件的Size大小. 我一细想,这个问题压根不需要通过改变现有接口提供更多的数据来做.下面从原理实现上简单说下: 关键点: 对于断点续传,关键点是两个: 1. 终端知道当前的文件和上一次加载的文件是

Retrofit+Rxjava+SqlBrite+SqlDelight实现多文件断点续传下载

介绍 实现功能: 多文件下载 暂停,开始断点续传 进度回调 sqlite保存下载信息 程序被杀了,重新打开继续断点下载 ... github: https://github.com/tpnet/RetrofitDownloadDemo , 有用可以点个start谢谢 本文需要SqlDelight.SqlBrite.AutoValue的知识.使用的是Rxjava1.2.9版本. 如何实现 看看流程图: 断点续传的原理为: 在请求头添加Range参数,值为bytes=从什么位置开始-. 多文件下载的

安卓开发笔记——关于文件断点续传

什么是断点续传? 客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载.用户可以节省时间,节省流量,也提高速度. 我写了个小Demo,先看下实现效果图:    断点续传的原理? 断点续传其实并没有那么神秘,它只不过是利用了HTTP传输协议中请求头(REQUEST HEADER)的不同来进行断点续传的. 以下是我

html5——文件断点续传

一直以来我都特别好奇,网上很多文件断点上传是怎么实现的,像百度云,最近看到一篇关于HTML5新特性的文章,里面的BLOB对象和FILE对象,有一个slice方法,可以将BLOB对象进行分割.BLOB(Binary Large Object)二进制大对象,属于XMLHttpRequest2.0中的一员,它的slice方法和字符串和数组的slice方法一样,用于分割二进制. 文件上传后台我是使用php的,上传的策略是先请求后台询问上传的文件是否存在,如果存在则发回已经上传到哪里.然后前端拿到这个位置