zoukankan      html  css  js  c++  java
  • 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 FTP1Clientclient.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 FTP1Clientclient.py -H 127.0.0.1 -P 9001 -u alex -p 1234
    190 # put C:UsersAdministratorDesktop
    oteForPython.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
    
    
  • 相关阅读:
    执行shell脚本的四种方式(转)
    linux free命令详解(一)
    linux TOP命令各参数详解【转载】
    grep命令
    vim常用命令
    IntelliJ Idea注释模板--类注释、方法注释
    [Chrome]抓请求直接生成可执行代码
    记录Markdown工具Typora
    VSCODE 配置远程开发环境
    [Boost::Polygon]多边形相减得到新的多边形序列
  • 原文地址:https://www.cnblogs.com/Macal/p/8372907.html
Copyright © 2011-2022 走看看