服务器端:

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