python socket 传送文件

server :

# -*- coding: utf-8 -*-
'''
实现思路:
    1. 读取从客户端发送过来的文件名
    2.检测文件是否存在
    3.检测文件大小
    4. 发送文件大小给客户端  
    5.等待客户端确认防止粘包
    6.打开文件
    7.开始边读边发数据
    8.关闭文件
    9.发送MD5
'''

import socket,os,hashlib

server  = socket.socket()
server.bind(('localhost',9988))

server.listen()

while True:
    conn, addr = server.accept()
    print("new connect:",addr)
    while True:
        data= conn.recv(1024)
        if not data:
            print("客户端已断开")
            break
        cmd,fileName = data.decode().split()
        print("fileName is:",fileName)
        if os.path.isfile(fileName):
            f = open(fileName,"rb")
            m= hashlib.md5()
            #获取文件大小
            file_size = os.stat(fileName).st_size
            
            #向客户端发送文件大小
            conn.send(str(file_size).encode())
            #wait for ack
            conn.recv(1024)
            
            for line in f:
                # 获取md5
                m.update(line) 
                #发送数据
                conn.send(line)  
            
            print("file md5:",m.hexdigest())
            conn.send(m.hexdigest().encode())
            f.close()
             
#             
            
            
server.close()

cilent:

# -*- coding: utf-8 -*-

import socket
import hashlib
from fileinput import filename
client  = socket.socket()

client.connect(('localhost',9988))

while True:
    cmd = input(">>:").strip()
    if len(cmd)==0:continue
    if cmd.startswith("get"):
        client.send(cmd.encode())
        #接收文件大小
        server_response = client.recv(1024)
        print("文件大小:",server_response.decode())
        
        #发送确认
        client.send(b"ok")
        
        file_size = int(server_response.decode())
        received_size =0
        filename = cmd.split()[1]
        f = open(filename+".new","wb")
        m = hashlib.md5()
#     received_data = b""
        while received_size < file_size:
            buff = 0;
            #只收取文件中的字符
            if file_size-received_size >1024 :
                buff = 1024
            else:
                buff = file_size-received_size 
            #接收数据
            cmd_res = client.recv(buff)
            #每次收到的字节数
            received_size = received_size+ len(cmd_res)
            
            m.update(cmd_res)
            #将接收的数据写到文件中
            f.write(cmd_res)
        else:
            print("done")
            f.close()
            new_file_md5 = m.hexdigest()
        
        server_file_md5 = client.recv(1024)
        print("server md5 is :",server_file_md5 )
        print("client md5 is :",new_file_md5 )
client.close()