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()

  

posted @ 2017-12-28 19:49  kevin.Xiang  阅读(1055)  评论(0编辑  收藏  举报