python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)

ftp server

1) 读取文件名

2)检查文件是否存在

3)打开文件

4)检查文件大小

5)发送文件大小给客户端

6)等客户端确认

7)开始边读边(md5计算)发数据

8)给客户端发md5

ftp下载文件

服务器
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
import socket
import os
import hashlib
server=socket.socket() server.bind(("127.0.0.1",9999)) server.listen(5) while True:
print("等待新指令")
conn,addr=server.accept()
print("连接信息",addr) while True:
try:
data=conn.recv(1024)
except ConnectionResetError as e:
print(e)
if not data: #客户端断开会传个空值过来,会导致进入死循环
print("客户端断开连接")
break cmd,filename=data.decode("utf-8").split()
print(filename) if os.path.isfile(filename):
f=open(filename,'rb')
m=hashlib.md5() #MD5验证
file_size=os.stat(filename).st_size #获取文件大小
conn.send(str(file_size).encode()) #给客户端发送文件大小 conn.recv(1024) #阻塞 因为有两次send,防止出现“粘包” for line in f:
m.update(line)
conn.send(line)
else:
f.close()
print("file md5 ",m.hexdigest())
print("send done") conn.send(m.hexdigest().encode()) #给客户端发送md5验证值 server.close()
客户端
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import os
import socket
import hashlib client=socket.socket()
client.connect(("127.0.0.1",9999)) while True:
cmd=input(">>:").strip()
if len(cmd)==0:continue
if cmd.startswith("get"):
client.send(cmd.encode("utf-8")) #给服务器端发送命令 response=client.recv(1024) #接受服务器相应:文件大小 total_file_size=int(response.decode("utf-8"))
client.send(b"read to recv file") #防止粘包,阻塞
f=open(cmd.split()[1],'wb')
m=hashlib.md5() #md5验证
recv_size=0
while recv_size<total_file_size:
if total_file_size - recv_size>1024: #判断最后一次接受数据,长度是多少,就收多少,如果还是1024有可能会出现粘包
size=1024
else:
size=total_file_size - recv_size recv_data=client.recv(size)
f.write(recv_data)
m.update(recv_data)
recv_size+=len(recv_data) #要以len来计算,最后一次的数据不一定是1024
else:
f.close() recv_md5=m.hexdigest() recv_server_md5=client.recv(1024).decode() print("md5 clinet and server", recv_md5,recv_server_md5)
上传文件
客户端
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import socket
import json
import os
host=("127.0.0.1",9000)
client=socket.socket() client.connect(host) while True:
cmd_str=input("请输入命令>>").strip()
if len(cmd_str)==0:continue
cmd_list=cmd_str.split() if cmd_list[0]=="put":
if len(cmd_list)==1:
print("not find put filename")
else:
filename=cmd_list[1]
if os.path.isfile(filename):
file_obj=open(filename,'rb')
filename2=filename.split("/")[-1]
print(filename2)
data_stat="%s %s" %(filename2,os.path.getsize(filename))
data={
"filename":filename2,
"filesize":os.path.getsize(filename)
}
client.send(json.dumps(data).encode("utf-8"))
for line in file_obj:
client.send(line)
file_obj.close()
else:
print("can not find file")
elif cmd_list[0]=="get":
pass 服务器端
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' import socket
import json
host=("127.0.0.1",9000)
server=socket.socket() server.bind(host)
server.listen(5) while True:
conn,addr=server.accept() data=conn.recv(4096)
print(data.decode("utf-8"))
data_dict=json.loads(data.decode("utf-8"))
filename=data_dict.get("filename")
f=open(filename,"wb")
recesize=0
while recesize<data_dict.get("filesize"):
recefile=conn.recv(4096)
f.write(recefile)
recesize+=len(recefile)
f.close()
上一篇:php.ini中Magic_Quotes_Gpc开关设置


下一篇:压力测试衡量CPU的三个指标:CPU Utilization、Load Average和Context Switch Rate