操作步骤:
1、读取文件名
2、文件是否存在
3、打开文件
4、读取文件大小
5、准备发送文件到客户端
6、等客户端确认,防止发生粘包
7、发送数据
8、md5校验
客户端
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"):
client.send(cmd.encode("utf-8")) # 发送1
data_size = client.recv(1024) # 接收2 文件大小
print("接收的文件大小为:", data_size)
client.send("准备好了".encode("utf-8")) # 发送3 发送确认
filename = cmd.split()[1]
recived_size = 0
m = hashlib.md5()
with open(filename + ".new", "wb") as f:
while recived_size < int(data_size.decode()):
if int(data_size.decode()) - recived_size > 1024:#防止粘包
size = 1024
else:
size = int(data_size.decode()) - recived_size
print(size)
recived_data = client.recv(size) # 接收4 接收文件
f.write(recived_data)
m.update(recived_data)
recived_data_size = len(recived_data)
recived_size += recived_data_size
else:
server_md5 = client.recv(1024)
print("来自服务器文件的MD5", server_md5.decode())
client_md5 = m.hexdigest()
print("接受后的文件的MD5", client_md5)
print("接收完毕")
print("接收到文件数据大小:", recived_size, "/", int(data_size.decode()))
client.close()
服务端
import os, socket
import hashlib
server = socket.socket()
server.bind(("localhost", 9999))
server.listen()
print("正在监听")
while True:
conn, address = server.accept()
print("新的会话", address)
while True:
print("等待新指令")
data = conn.recv(1024) # 接收1
if not data:
print("客户端已断开")
break
cmd, filename = data.decode().split()
if os.path.isfile(filename):
with open(filename, "rb") as f:
file_data_size = os.stat(filename).st_size
print("发送的文件大小为:", file_data_size)
conn.send(str(file_data_size).encode("utf-8")) # 发送2 文件大小
client_ack = conn.recv(1024) # 接收3 接收确认
m = hashlib.md5()
for line in f:
conn.send(line) # 发送4 文件内容
m.update(line)
conn.send(m.hexdigest().encode("utf-8"))
print("md5值为:",m.hexdigest())
print("发送完毕")
server.close()
客户端如图所示
>>:get ThunderVIP-jsb.exe
接收的文件大小为: b'26659288'
764
来自服务器文件的MD5 c9ccdae767ebccd4b3f86ff3506c16ba
接受后的文件的MD5 c9ccdae767ebccd4b3f86ff3506c16ba
接收完毕
接收到文件数据大小: 26659288 / 26659288
>>:
服务端
正在监听
新的会话 ('127.0.0.1', 56787)
等待新指令
发送的文件大小为: 26659288
md5值为: c9ccdae767ebccd4b3f86ff3506c16ba
发送完毕
等待新指令