服务器端:
import socket, hashlib server = socket.socket() server.bind(("localhost", 9999)) server.listen() conn, addr = server.accept() print("connect is built! from", addr) m = hashlib.md5() while True: filename = conn.recv(1024).decode() # 以二进制形式打开 with open(filename, "rb") as fin: file_data = fin.read() print("filename:", filename) # 传输文件长度和md5码 m.update(file_data) file_info = str(len(file_data)) + " " + m.hexdigest() conn.send(file_info.encode()) # 为避免粘包,接收一个确认消息 res = conn.recv(1024).decode() print(res) conn.send(file_data) conn.close()
客户端:
# Author:Winter Liu is coming! import socket, hashlib client = socket.socket() client.connect(("localhost", 9999)) m = hashlib.md5() while True: filename = input(">>>") client.send(filename.encode()) file_info = client.recv(1024).decode().split(" ") file_length = int(file_info[0]) file_md5 = file_info[1] print("the length of file is {}".format(file_length)) print("the md5 of source file is {}".format(file_md5)) client.send("file transfer is ready".encode()) recv_file_length = 0 recv_file = "" # 使用二进制文件,用于socket传输要方便的多 with open("test.txt", "wb+") as fout: while recv_file_length != file_length: data = client.recv(4096) fout.write(data) recv_file_length += len(data) print(recv_file_length, len(data)) fout.seek(0) f = fout.read() # md5码验证 m.update(f) if file_md5 == m.hexdigest(): print("file transfer is complete!") else: print("Error, md5 is wrong!") client.close()