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("参数不正确,请查看帮助信息")

 

 

 


posted @ 2018-03-14 10:11  东郭仔  阅读(179)  评论(0)    收藏  举报