socket实现简单传文件ftp/scp服务,加MD5验证文件
1.服务端
import socket, os, hashlib, time
server = socket.socket()
server.bind(('0.0.0.0', 22222))
server.listen()
while True:
conn, addr = server.accept()
print("new conn:", addr)
while True:
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
cmd, filename = data.decode().split()
if os.path.isfile(filename):
# 获取文件大小
file_zise = os.stat(filename).st_size
conn.send(str(file_zise).encode("utf-8"))
f = open(filename, "rb")
conn.recv(1024)
m = hashlib.md5()
for line in f:
m.update(line)
conn.send(line)
f.close()
#time.sleep(0.5) 避免粘包,可在客户端做判断
conn.send(m.hexdigest().encode("utf-8"))
print("send done")
server.close()
2.服务端
import socket, hashlib
client = socket.socket()
client.connect(('localhost', 22222))
while True:
cmd = input(">>:").strip()
if len(cmd) == 0: continue
if cmd.startswith("get"):
client.send(cmd.encode("utf-8"))
server_respons = client.recv(1024)
client.send("知道接收的文件大小了".encode("utf-8"))
file_total_size = int(server_respons.decode())
received_size = 0
filename = cmd.split()[1]
f = open(filename + ".new", "wb")
m = hashlib.md5()
while received_size < file_total_size:
if file_total_size - received_size >= 1024:
size = 1024
else:
size = file_total_size - received_size
data = client.recv(size)
received_size += len(data)
m.update(data)
f.write(data)
else:
new_file_md5 = m.hexdigest()
print("file recv done")
f.close()
server_file_md5 = client.recv(1024)
print("client file md5", new_file_md5)
print("server file md5", server_file_md5)
client.close()
3.使用方法
get filename