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