python练习——moudule03——选课系统

开发简单的FTP:
1. 用户登陆
2. 上传/下载文件put/get
3. 不同用户家目录不同home
4. 查看当前目录下文件ls
5. 充分使用面向对象知识

目录:

  1 import os,socket,optparse,json,time
  2 
  3 STATUS_CODE ={
  4     200 : "操作成功",
  5     601 : '操作失败'
  6 }
  7 
  8 class FTPClient(object):
  9     def __init__(self):
 10         self.parser = optparse.OptionParser()
 11         self.parser.add_option('-H', '--host', dest='host', help='host of server')
 12         self.parser.add_option('-P','--port',type='int',dest= 'port',help='port of server')
 13         self.parser.add_option('-u','--username',dest= 'username',help='username')
 14         self.parser.add_option('-p','--password',dest= 'password',help='password')
 15         (self.options,self.args) = self.parser.parse_args()
 16         self.verify_args()
 17         self.make_connection()
 18         self.header = {}
 19 
 20     def make_connection(self):
 21         self.sock = socket.socket()
 22         self.sock.connect((self.options.host,self.options.port))
 23 
 24     def verify_args(self):
 25         if self.options.host and self.options.port:
 26             if self.options.port > 0 and self.options.port<= 65535:
 27                 if self.options.username and self.options.password:
 28                     return True
 29                 else:
 30                     exit('check your username and password')
 31             else:
 32                 exit("worry Port!")
 33 
 34         else:
 35             exit('Please check your host and port! They can not be null!')
 36 
 37     def authenticate(self):
 38         '''登陆验证'''
 39         # print('authenticating.........')
 40         # print(self.get_auth_result(self.options.username,self.options.password).get('code'))
 41         if self.get_auth_result(self.options.username,self.options.password).get('code') == 200:
 42             self.header = {'username':self.options.username}
 43             return True
 44         else:
 45             raise Exception('worry username or password!')
 46             # retry_count = 0
 47             # while retry_count < 3:
 48             #     user = input("username>>>").strip()
 49             #     password = input("password>>>").strip()
 50             #     self.get_auth_result(user,password)
 51             # else:
 52             #     retry_count += 1
 53     def get_auth_result(self,username,password):
 54         data = {
 55             'action' : 'auth',
 56             'username' : username,
 57             'password' : password
 58         }
 59         # print(data)
 60         self.sock.sendall(json.dumps(data).encode())
 61         # print('send sucessfully')
 62         # print(self.get_response())
 63         # print(type(self.get_response()))
 64         return  self.get_response()
 65 
 66     def get_response(self):
 67         '''获取服务器结果'''
 68         recv = self.sock.recv(1024)
 69         recv = json.loads(recv.decode())
 70         # print(recv)
 71         print('response',recv)
 72         # print(type(recv))
 73         return recv
 74 
 75     def opearte_cmd(self,cmd):
 76         # print('12345')
 77         # print(cmd,'&&&&&&&&')
 78         if cmd is None :
 79             raise Exception('cmd cannot be null')
 80         cmd_list =cmd.split()
 81         if cmd_list[0] =='get' and len(cmd_list) == 2:
 82             self._get(cmd)
 83             return
 84         if cmd_list[0] =='put' and len(cmd_list) == 2:
 85             if os.path.exists(cmd_list[1]):
 86                 self._put(cmd)
 87                 return
 88         if cmd_list[0] =='ls':
 89             self._ls()
 90             return
 91         if cmd_list[0] =='exit':
 92             exit()
 93         else:
 94             raise Exception('cmd is worry!please try again later!')
 95 
 96     def get_FileSize(self,filePath):
 97         fsize = os.path.getsize(filePath)
 98         # fsize = fsize / float(1024)
 99         # return round(fsize, 2)
100         return fsize
101     def _get(self,cmd):
102         cmd_list = cmd.split()
103         data = {
104             'header': self.header,
105             'action': 'get',
106             'filename': cmd_list[1]
107         }
108         recv = self.sock.sendall(json.dumps(data).encode())
109         response = self.get_response()
110         print('recv',response)
111 
112         if response.get('code') == 200:
113             file_size = response.get('file_size')
114             with open(cmd_list[1],'wb') as f:
115                 recv_size = 0
116                 while recv_size < int(file_size):
117                     recv_data = self.sock.recv(1024)
118                     # print(recv_data)
119                     recv_size += len(recv_data)
120                     # print(recv_size)
121                     f.write(recv_data)
122                     self.sock.send(b'1')
123                 print(self.get_response())
124             return
125         else:
126             raise Exception('worry with server in get file .')
127 
128 
129     def _put(self,cmd):
130         cmd_list = cmd.split()
131         filename = cmd_list[1].split('\\')[-1]
132         print(cmd_list[1])
133         file_size = self.get_FileSize(cmd_list[1])
134         data = {
135             'header': self.header,
136             'action': 'put',
137             'filename': filename,
138             'file_size':file_size
139         }
140         self.sock.sendall(json.dumps(data).encode())
141         recv = self.get_response()
142         if recv.get('code') == 200:
143             print(os.path.exists(cmd_list[1]))
144             f = open(cmd_list[1],'rb')
145             size = 0
146             for line in f:
147                 size += len(line)
148                 # print(size)
149                 # print(line)
150                 self.sock.send(line)
151                 self.sock.recv(1)
152             f.close()
153             print('recv:',self.get_response())
154             return True
155         else:
156             msg = {
157                 'code':recv.get('code'),
158                 'message':  STATUS_CODE.get(recv.get('code'))
159                    }
160             raise Exception(msg)
161 
162     def _ls(self):
163         data = {
164             'header': self.header,
165             'action': 'ls'
166         }
167         self.sock.sendall(json.dumps(data).encode())
168         print('recv:', self.get_response())
169         return True
170 
171 #python FTP1\Client\client.py -H 127.0.0.1 -P 9001 -u alex -p 1234
172 
173     def interactive(self):
174         if self.authenticate():
175             print('start interactive'.center(60,'-'))
176             while True:
177                 print('''
178                 List of functions:
179                 get :   e.g:get XXX.txt,
180                 put :   e.g:put XXX.txt,
181                 ls  :   e.g:ls
182                 exit :  e.g:exit
183                 ''')
184                 cmd = input("cmd>>>").strip()
185                 self.opearte_cmd(cmd)
186                 continue
187 
188 
189 #python FTP1\Client\client.py -H 127.0.0.1 -P 9001 -u alex -p 1234
190 # put C:\Users\Administrator\Desktop\noteForPython.txt
191 if __name__ == '__main__':
192     client = FTPClient()
193     client.interactive()
client.py
1 import os,sys
2 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
3 sys.path.append(base_dir)
4 
5 from core import main
6 
7 if __name__ == '__main__':
8     main.ArgvHandler()
server.py
 1 import os,sys
 2 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 3 
 4 USER_HOME = '%s/home'%(base_dir)
 5 LOG_DIR = '%s/log'%(base_dir)
 6 LOG_level = 'DEBUG'
 7 ACCOUNT_FILE = '%s/db/account.ini'%(base_dir)
 8 
 9 HOST = '127.0.0.1'
10 PORT = 9001
settings.py
  1 import socketserver,json,configparser,os,time
  2 
  3 STATUS_CODE ={
  4     200 : "操作成功",
  5     601 : '操作失败'
  6 }
  7 Base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  8 from conf import settings
  9 class FTPHandler(socketserver.BaseRequestHandler):
 10     def handle(self):
 11         while True:
 12             print("welcome to FTPHander-handle-whileTrue...")
 13             self.data = self.request.recv(1024).strip()
 14             if  self.data is None:
 15                 print("Client is closed")
 16                 break
 17             print(self.client_address[0])
 18 
 19             data = json.loads(self.data.decode())
 20 
 21             if data.get('action') == 'auth':
 22                 self._auth(data)
 23             elif data.get('action') in ('put','get','ls'):
 24                 func = getattr(self,'_%s'%data.get('action'))
 25                 func(data)
 26             else:
 27                 print('invlid cmd')
 28                 self.send_response(601)
 29 
 30 
 31     def _auth(self,data):
 32         # print(data)
 33         parser = configparser.ConfigParser()
 34         parser.read(settings.ACCOUNT_FILE)
 35         section_list = parser.sections()
 36         if data.get('username') in section_list:
 37             true_pwd = parser.get(data.get('username'),'password')
 38             quation = parser.get(data.get('username'),'quation')
 39             # print(true_pwd,quation)
 40             # print(data.get('password'))
 41             if true_pwd == data.get('password'):
 42                 # print('1313')
 43                 self.send_response(200)
 44 
 45 
 46     # def _auth(self,*args,**kwargs):
 47     #     print(args.center(60,'-'))
 48     #     parser = configparser.ConfigParser()
 49     #     parser.read(settings.ACCOUNT_FILE)
 50     #     section_list = parser.sections()
 51     #     if args['username'] in section_list:
 52     #         true_pwd = parser.get(args['username'],'password')
 53     #         quation = parser.get(args.get['username'],'quation')
 54     #         if true_pwd == args['password']:
 55     #             self.send_response(200)
 56         # if args.get('username') in section_list:
 57         #     true_pwd = parser.get(args.get('username'),'password')
 58         #     quation = parser.get(args.get('username'),'quation')
 59         #     if true_pwd == args.get('password'):
 60         #         self.send_response(200)
 61 
 62     def send_response(self,code,data=None):
 63         response ={'code':code,'msg':STATUS_CODE[code]}
 64         if data:
 65             response.update( data )
 66         self.request.send(json.dumps(response).encode())
 67 
 68     def verify_data(self,*args):
 69         pass
 70 
 71     def _put(self,data):
 72         print('start put......................................................')
 73         self.verify_data(data)
 74         if data.get('header') == {}:
 75             self.send_response(601)
 76         parser = configparser.ConfigParser()
 77         parser.read(settings.ACCOUNT_FILE)
 78         section_list = parser.sections()
 79         username_of_data = data.get('header').get('username')
 80         flag = username_of_data in section_list
 81         # print(flag)
 82         if flag:
 83             quation =  parser.get(username_of_data, 'quation')
 84             # home_DIR = Base_dir.join('home\%s' % username_of_data)
 85             home_DIR = os.path.join(Base_dir,'home\%s' % username_of_data)
 86             # print(home_DIR)
 87             user_exit_file = os.listdir(home_DIR)
 88             print(user_exit_file)
 89             size_exited = 0
 90             for filePath in user_exit_file:
 91                 filePath = os.path.join(home_DIR,filePath)
 92                 size_exited += self.get_FileSize(filePath)
 93 
 94             puted_file_size = data.get('file_size')
 95 
 96             if puted_file_size > int(quation) - size_exited:
 97                 self.send_response(601)
 98             else:
 99                 self.send_response(200)
100                 puted_filename = data.get('filename')
101                 if puted_filename in user_exit_file:
102                     puted_filename = '%s-1'% puted_filename
103                 # filename = home_DIR.join(puted_filename)
104                 filename = os.path.join(home_DIR,puted_filename)
105                 get_FileSize = 0
106                 with open(filename,"wb") as f:
107                     while get_FileSize < puted_file_size:
108                         file_data = self.request.recv(1024)
109                         f.write(file_data)
110                         get_FileSize += len(file_data)
111                         self.request.send(b'1')
112                         # print(file_data)
113                         # print(get_FileSize, puted_file_size)
114                     self.send_response(200)
115                 print('put successfully...'.center(60,'-'))
116 
117 
118     def get_FileSize(self,filePath):
119         fsize = os.path.getsize(filePath)
120         # fsize = fsize / float(1024)
121         # return round(fsize, 2)
122         return fsize
123 
124     def _get(self,data):
125         print('start get................')
126         # self.verify_data(data)
127         if data.get('header') == {}:
128             self.send_response(601)
129         parser = configparser.ConfigParser()
130         parser.read(settings.ACCOUNT_FILE)
131         section_list = parser.sections()
132         username_of_data = data.get('header').get('username')
133         filename = data.get('filename')
134         # home of user
135         home_DIR = os.path.join(Base_dir,'home\%s' % username_of_data)
136         #abspath
137         filename = os.path.join(home_DIR,filename)
138         if os.path.isfile(filename):
139             file_size = os.path.getsize(filename)
140             self.send_response(200,{'file_size':'%s'%file_size})
141             f = open(filename,'rb')
142             for line in f:
143                 print(line)
144                 self.request.send(line)
145                 self.request.recv(1)
146             self.send_response(200)
147             print("get successfully.....")
148         else:
149             self.send_response(601)
150 
151 
152     def _ls(self,data):
153         print('start ls...')
154         self.verify_data(data)
155         if data.get('header') == {}:
156             self.send_response(601)
157         parser = configparser.ConfigParser()
158         parser.read(settings.ACCOUNT_FILE)
159         section_list = parser.sections()
160         username_of_data = data.get('header').get('username')
161         flag = username_of_data in section_list
162         if flag:
163             home_DIR = os.path.join(Base_dir, 'home\%s' % username_of_data)
164             user_exit_file = os.listdir(home_DIR)
165             self.request.sendall(json.dumps(user_exit_file).encode())
166             for i in user_exit_file:
167                 print(i)
168 
169 
170     def _cd(self,*args,**kwargs):
171         pass
172 
173 if __name__ == '__main__':
174     HOST, PORT = settings.Host, settings.PORT
ftp_server.py
 1 from core.ftp_server import FTPHandler
 2 from conf import settings
 3 import socketserver
 4 
 5 class ArgvHandler(object):
 6     def __init__(self):
 7         self.start()
 8         # self.parser = optparse.OptionParser()
 9         # self.parser.add_option('-H','--host',dest= 'host',help='host of server')
10         # self.parser.add_option('-P','--port',type=int,dest= 'port',help='port of server')
11         # (self.options,self.args) = self.parser.parse_args()
12         # print(self.options,self.args)
13         # # print(dir(self.options))
14         # print(self.options.host)
15         # self.verify_args()
16 
17 
18     def verify_args(self):
19         if hasattr(self,self.args[0]):
20             func = getattr(self,self.args[0])
21             func()
22 
23         else:
24             print(self.parser.print_help())
25 
26     def start(self):
27         print('going to start...'.center(60,'-'))
28         server = socketserver.ThreadingTCPServer((settings.HOST, settings.PORT),FTPHandler)
29         server.serve_forever()
main.py

 


posted @ 2018-01-28 23:37  云上有龙  阅读(383)  评论(0编辑  收藏  举报