本次ftpV2,完善了上次未完成的代码,实现上传下载,断点续传,客户端任务进度条等功能
废话不多说,上代码,详细解释,请查看代码注释
Server端
#!/usr/bin/env python
# --coding = utf-8
# Author Allen Lee
import socketserver,json,os
import subprocess
#创建ftpserver类,并继承socktserver,借用其io多路复用的select方法,以实现多响应用户的并发
class Myftp(socketserver.BaseRequestHandler):
#再次重写handle方法,由于类的继承中,self遵循自下而上,从左到右的寻址规则,因此被重写的方法将优先被调用
def handle(self):
#权限控制
while True:
if not self.checkuser():
break
else:
self.request.sendall(bytes('welcome to myftp',encoding='utf-8'))
while True:
res_data = self.request.recv(1024).strip()
if not res_data:
break
#再次统一处理client端发出的json包,
res_msg = json.loads(str(res_data,encoding='utf-8'))
#通过反射来引导用户到对应的方法中
res_tag = res_msg.get('action')
if hasattr(self,res_tag):
getattr(self,res_tag)(res_msg)
else:break
self.request.close()
#用户验证
def checkuser(self):
server_tag = False
res = self.request.recv(1024)
if len(res) == 0:
return error
userinfo = json.loads(str(res,encoding='utf-8'))
if userinfo[0].get('username') == 'username' and userinfo[0].get('password') == 'password':
server_tag = True
return True
else:
return False
def put(self,res_msg):
file_name = res_msg.get('file_name')
file_size = res_msg.get('file_size')
ret = os.path.isfile(file_name)
if not ret:
#此为正常传输
with open(file_name,'wb+')as f:
self.request.sendall(bytes('ok',encoding='utf-8'))
recv_data = self.request.recv(1024)
f.write(recv_data)
else:
#此为断点续传处理
with open(file_name,