• Python socket文件传送md5校验


    • soket_server
    import socket,os,hashlib
    server = socket.socket()
    server.bind(('0.0.0.0',9999))
    server.listen()
    while True:
        conn,addr = server.accept()
        print("new conn:",addr)
        while True:
            print("server on....")
            data = conn.recv(1024)
            if not data:
                print("客户端已断开")
                break
            cmd,filename = data.decode().split()
            print(filename)
            if os.path.isfile(filename): #是否是文件
                f = open(filename,"rb")
                m = hashlib.md5() #创建md5校验
                file_size = os.stat(filename).st_size #获取文件大小
                conn.send(str(file_size).encode()) #发送文件大小
                conn.recv(1024) #等待ACK交互防止粘包
                for line in f:
                    m.update(line) #递增加密文件
                    conn.send(line)
                print("file md5",m.hexdigest()) #打印16进制md5
                f.close()
                conn.send(m.hexdigest().encode())
            print("send done")
    server.close()
    

      

    • soket_client
    import socket
    import hashlib
    client = socket.socket()
    client.connect(('localhost',9999))
    while True:
        cmd = input(">>:").strip()
        if len(cmd) == 0:continue
        if cmd.startswith("get"): #是否以get开头
            client.send(cmd.encode())
            server_response = client.recv(1024)
            print("server respoense:",server_response)
            client.send(b"ready to recv file")  #发送ACK确认,交互防止send粘包
            file_total_size = int(server_response.decode())
            received_size = 0
            filename = cmd.split()[1]
            f = open(filename + ".new","wb")
            m = hashlib.md5() #使用md5加密
            while received_size < file_total_size:  #判断总数据比递增接收数据大就成立
                if file_total_size - received_size > 1024: #数据比recv大就成立
                   size = 1024
                else: #最后一次,还剩多少
                   size = file_total_size - received_size  #求出剩余recv数值
                   print("last receive:",size) #最后一次收了多少
                data = client.recv(size)
                received_size += len(data)  #递增接收数据
                m.update(data) #递增接收数据并加密md5
                f.write(data)
                #print(file_total_size,received_size) #每次发送大小
            else:
                new_file_md5 = m.hexdigest()
                print("file recv done",received_size,file_total_size)
                f.close()
            server_file_md5 = client.recv(1024)
            print("server file md5:",server_file_md5)
            print("client file md5:",new_file_md5)
    client.close()
    

      

  • 相关阅读:
    C# 文件压缩与解压(ZIP格式)
    sqlite 报 no such table 错误
    又一次的轮回
    什么是数据结构
    紧张繁忙的一周
    《编程匠艺》读书笔记之十九
    [转]软件开发者面试百问
    关于学习设计模式的一些废话
    雷人的山寨版搜索引擎
    [转]Struts 2.1发布
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/8137508.html
Copyright © 2020-2023  润新知