day 7作业 简单的FTP
第七天作业:简单FTP程序
作者:keven
使用说明:运行f_s,运行f_c ,输入用户名,密码,例如zhangsan, zhangsang
作业要求:
1. 用户登陆
2. 上传/下载文件
3. 不同用户家目录不同
4. 查看当前目录下文件
5. 充分使用面向对象知识
目录:

ftp_server ,如下:
1 import os,socketserver,json,sys 2 basepath=os.path.dirname(os.path.dirname(__file__)) 3 # print(basepath) 4 sys.path.append(basepath) 5 # path=os.path.join(basepath,'db','zhangsan') 6 # print(path) 7 # print(os.path.isdir(path)) 8 9 class MyTCPHandler(socketserver.BaseRequestHandler): 10 ''' 11 FTP server class 12 ''' 13 14 def authenticate(self,*args): 15 #print(type(*args)) 16 #print(*args) 17 cmd_dic=args[0] 18 #print(args[0]) 19 user=cmd_dic["username"] 20 passwd=cmd_dic["password"] 21 #print(user,passwd) 22 with open('userinfo',"r") as f: 23 for line in f: 24 line=line.split(",") 25 if user == line[1] and passwd == line[2]: 26 path=os.path.join(basepath,'db',user) 27 ack_dic={ 28 'authenticated':'Y', 29 'path':path 30 } 31 #print(ack_dic) 32 self.request.send(json.dumps(ack_dic).encode()) 33 break 34 else: 35 ack_dic={ 36 'authenticated':'N' 37 } 38 #print(ack_dic) 39 self.request.send(json.dumps(ack_dic).encode()) 40 41 42 43 def put(self,*args): 44 '''接受客户端文件''' 45 cmd_dic = args[0] 46 path = cmd_dic["path"] 47 filename=os.path.join(path,cmd_dic["filename"]) 48 filesize=cmd_dic["size"] 49 if os.path.isfile(filename): 50 f = open(filename,+"new","wb") 51 else: 52 f =open(filename,"wb") 53 54 self.request.send(b"200 ok") 55 received_size= 0 56 while received_size < filesize: 57 data = self.request.recv(1024) 58 f.write(data) 59 received_size += len(data) 60 else: 61 print("file {} has upload".format(filename)) 62 63 def ls(self,*args): 64 '''查看用户目录文件''' 65 cmd_dic=args[0] 66 path=cmd_dic["path"] 67 res=os.listdir(path) 68 self.request.send(json.dumps(res).encode()) 69 70 def get(self,*args): 71 '''客户端下载文件''' 72 cmd_dic=args[0] 73 filename=os.path.join(cmd_dic["path"],cmd_dic["filename"]) 74 if os.path.isfile(filename): 75 size=os.stat(filename).st_size 76 ack_dic={ 77 "file_status":"Y", 78 "size":size 79 } 80 self.request.send(json.dumps(ack_dic).encode()) 81 82 with open(filename,"rb") as f: 83 for line in f: 84 self.request.send(line) 85 else: 86 print("File download complete ") 87 else: 88 ack_dic={ 89 "file_status":"N" 90 } 91 self.request.send(json.dumps(ack_dic).encode()) 92 93 94 95 96 def handle(self): 97 while True: 98 try: 99 self.data = self.request.recv(1024).strip() 100 #print("{} wrote:".format(self.client_addrss[0])) 101 print(self.data) 102 cmd_dic = json.loads(self.data.decode()) 103 action = cmd_dic["action"] 104 if hasattr(self,action): 105 func =getattr(self,action) 106 func(cmd_dic) 107 except ConnectionRefusedError as e: 108 print("error",e) 109 break 110 111 112 if __name__ == '__main__': 113 HOST,PORT ='localhost',9001 114 server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler) 115 server.serve_forever()
ftp_client
1 import os,socket,json 2 3 4 5 class FtpClient(object): 6 ''' 7 client class 8 ''' 9 def __init__(self): 10 self.client =socket.socket() 11 12 13 def help(self): 14 msg=''' 15 ls 16 put filename 17 get filename 18 ''' 19 print(msg) 20 21 def connect(self,host,port): 22 self.client.connect((host,port)) 23 24 def authenticate(self): 25 '''验证用户名,密码是否正确,正确返回验证状态及用户目录''' 26 user=input("pls input your username:") 27 passwd=input("pls input your password:") 28 msg_dic={"action":"authenticate", 29 'username':user, 30 "password":passwd} 31 self.client.send(json.dumps(msg_dic).encode()) 32 return self.client.recv(1024).decode() 33 34 35 def interactive(self): 36 '''判断用户输入命令,根据命令分发操作''' 37 auth_res=self.authenticate() 38 auth_res=eval(auth_res) 39 #print(type(auth_res)) 40 if auth_res['authenticated'] == "Y": 41 path=auth_res["path"] 42 while True: 43 cmd=input(">>>:").strip() 44 if len(cmd) == 0:continue 45 cmd_str = cmd.split() 46 #print(cmd_str) 47 #print(cmd_str[0]) 48 if hasattr(self,cmd_str[0]): 49 func=getattr(self,cmd_str[0]) 50 func(cmd,path) 51 else: 52 self.help() 53 elif auth_res['authenticated'] == "N": 54 print("用户名,密码错误") 55 56 def ls(self,*args): 57 '''显示用户下的文件''' 58 #print("1",args[0],args[1],type(args[0])) 59 cmd=args[0].split() 60 path=args[1] 61 62 msg_dic={ 63 "action":'ls', 64 "path":path 65 } 66 #print(msg_dic) 67 self.client.send(json.dumps(msg_dic).encode()) 68 ack_dic=json.loads(self.client.recv(1024).decode()) 69 print(ack_dic) 70 71 72 def get(self,*args): 73 '''下载文件''' 74 cmd_split = args[0].split() 75 path=args[1] 76 #print(args[1]) 77 if len(cmd_split) > 1: 78 filename=cmd_split[1] 79 #print(type(filename)) 80 msg_dic={ 81 "action":"get", 82 "filename":filename, 83 "path":path 84 } 85 #print(msg_dic) 86 self.client.send(json.dumps(msg_dic).encode()) 87 ack_dic=json.loads(self.client.recv(1024).decode()) 88 #print(ack_dic) 89 file_status=ack_dic.get("file_status") 90 if file_status == "Y": 91 file_size=ack_dic.get("size") 92 if os.path.isfile(filename): 93 #print(type(filename)) 94 f = open(filename +"new", "wb") 95 else: 96 f = open(filename, "wb") 97 received_size = 0 98 while received_size < file_size: 99 data = self.client.recv(1024) 100 f.write(data) 101 received_size += len(data) 102 else: 103 print("file {} has download".format(filename)) 104 105 elif file_status == "N": 106 print("下载的文件不存在") 107 else: 108 print("参数不正确,请查看帮助信息") 109 110 def put(self,*args): 111 '''上传文件''' 112 cmd_split = args [0].split() 113 print(args[1]) 114 path=args[1] 115 if len(cmd_split) > 1: 116 filename = cmd_split[1] 117 if os.path.isfile(filename): 118 filesize = os.stat(filename).st_size 119 msg_dic = { 120 "action":"put", 121 "filename":filename, 122 "size":filesize, 123 'overridden':True, 124 'path':path 125 } 126 self.client.send(json.dumps(msg_dic).encode()) 127 #防止粘包,等待服务器确认 128 server_response = self.client.recv(1024) 129 f=open(filename,"rb") 130 for line in f: 131 self.client.send(line) 132 else: 133 print("file upload success...") 134 f.close() 135 else: 136 print(filename,"is not exitst") 137 else: 138 print("参数不正确,请查看帮助信息")

浙公网安备 33010602011771号