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

import socketserver, os , json , struct, hashlib

codes = {
    "文件已存在":1001,
    "文件不存在":1002
}

File_Path = r'C:\Users\17303\Desktop\电脑的组成.avi' #需要传的文件路径
File_Size = os.path.getsize(File_Path)

f = open(File_Path,"rb")
md5 = hashlib.md5()
md5.update(f.read())
md5_val = md5.hexdigest()

File_info = {
    "FileName":"电脑的组成.avi",
    "FileSize":File_Size,
    "md5_val":md5_val
}
"""
先开始
1.发送字典的长度;
2.发送字典 (Filename,文件md5值,FileSize)
3.接收字典 (Code,FileSize)/(Code,FileSize(0))
4.发送文件 (seek(FIleSize))
5.校验完整性
"""
File_info_json = json.dumps(File_info).encode("utf-8")
File_info_json_length = struct.pack("i",len(File_info_json))

class My(socketserver.BaseRequestHandler):
    
    def handle(self):
        self.request.send(File_info_json_length)
        self.request.send(File_info_json)
        response = json.loads(self.request.recv(1024).decode("utf-8"))
        
        Code = response["Code"]
        Md5_Size = response["Md5_Size"]
        self.send_info(File_Path,Md5_Size)

        client_md5 = self.request.recv(1024).decode("utf-8")

        self.verify(client_md5,md5_val)

    def send_info(self, File_Path, Md5_Size):
        f = open(File_Path,"rb")
        f.seek(Md5_Size)
        for line in f:
            self.request.send(line)

    def verify(self, client_md5, md5_val):
        if md5_val == client_md5:
            self.request.send(b'200')

        else:
            self.request.send(b'404')

server = socketserver.ThreadingTCPServer(("127.0.0.1",8080,), My)
server.serve_forever()

猜你喜欢

转载自www.cnblogs.com/deng-fei/p/11271938.html
今日推荐