• 作业:FTP


    作业题目: 开发一个支持多用户在线的FTP程序

    • 作业需求:

      要求
      1.用户加密认证(已实现)
      2.允许同时多用户登录
      3.每个用户有自己的家目录 ,且只能访问自己的家目录(已实现)
      4.对用户进行磁盘配额,每个用户的可用空间不同
      5.允许用户在ftp server上随意切换目录(已实现)
      6.允许用户查看当前目录下文件(已实现)
      7.允许上传和下载文件,保证文件一致性(md5)(已实现)
      8.文件传输过程中显示进度条(已实现)
      9.附加功能:支持文件的断点续传(已实现)

     FTP实现实现并发,在main模块里进行修改,增加了mytherad.py

    1.在之前开发的FTP基础上,开发支持多并发的功能
    2.不能使用SocketServer模块,必须自己实现多线程
    3.必须用到队列Queue模块,实现线程池
    4.允许配置最大并发数,比如允许只有10个并发用户

    C:.
    │ RAMDE
    │ 
    │ __init__.py

    ├─ftpclient
    │ ..bak
    │ ..dat
    │ ..dir
    │ a.txt
    │ client.py -- 客户端
    │ __init__.py

    └─ftpserver
    │ __init__.py

    ├─bin
    │ server.py ----- 启动文件
    │ __init__.py

    ├─conf
    │ │ account.ini  ---- 用户数据
    │ │ setting.py ----- 配置文件
    │ │ __init__.py
    │ │
    │ └─__pycache__
    │ setting.cpython-36.pyc
    │ __init__.cpython-36.pyc

    ├─core
    │ │ logger.py  ----  日志
    │ │ main.py  ----- 主程序
    │ │ main_server.py  --- 解析命令
    │ │ mythread.py --- 实现线程,定义线程池
    │ │
    │ └─__pycache__
    │ logger.cpython-36.pyc
    │ main.cpython-36.pyc
    │ main_server.cpython-36.pyc
    │ __init__.cpython-36.pyc

    ├─home
    │ │ __init__.py
    │ │
    │ └─alex  ---- 主目录
    │ a.txt
    │ 

    └─log ---  日志文件

    注:需要在cmd上运行程序,否则会报错,服务端:python server.py start  客户端:python client.py  -s ip地址 -P 端口

    server.py

     1 #!/usr/bin/env python3
     2 # -*- coding:utf-8 -*-
     3 import os
     4 import sys
     5 
     6 
     7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     8 sys.path.append(BASE_DIR)
     9 
    10 if __name__ == '__main__':
    11     from core import main_server
    12     argv_parser = main_server.Mangement(sys.argv)
    13     argv_parser.execute()
    View Code

    setting.py

     1 #! /usr/bin/env python3
     2 # -*- coding:utf-8 -*-
     3 import os
     4 import socket
     5 import logging
     6 
     7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
     8 HOME_DIR = os.path.join(BASE_DIR,'home')
     9 ACCOUNT_INI = r'%sconfaccount.ini'% BASE_DIR
    10 
    11 address_family = socket.AF_INET
    12 socket_type = socket.SOCK_STREAM
    13 max_packet_size = 8096
    14 request_queue_size = 5
    15 
    16 LOG_LEVE = logging.INFO
    17 
    18 LOG_TYPE = {
    19     'access':'access.log',
    20 }
    21 
    22 LOG_FORMATTER =logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    23 LOG_PATH = os.path.join(BASE_DIR,'log')
    24 
    25 SERVER_ADDR = '127.0.0.1'
    26 SERVER_PORT = 8080
    View Code

    logger.py

     1 #!/usr/bin/env python3
     2 # -*- coding:utf-8 -*-
     3 
     4 from conf import setting
     5 import logging
     6 import os
     7 from logging import handlers
     8 
     9 def logger_log(log_type):
    10     log = logging.getLogger(log_type)
    11     log.setLevel(setting.LOG_LEVE)
    12 
    13     file_log = os.path.join(setting.LOG_PATH,setting.LOG_TYPE[log_type])
    14     fh = handlers.TimedRotatingFileHandler(file_log,when='D',interval=3,encoding='utf-8')
    15     log.addHandler(fh)
    16 
    17     file = setting.LOG_FORMATTER
    18     fh.setFormatter(file)
    19     return log

    main.py

      1 #!/usr/bin/env python3
      2 # -*- coding:utf-8 -*-
      3 
      4 import socket
      5 import json
      6 import configparser
      7 import hashlib
      8 import struct
      9 import os
     10 import subprocess
     11 import time
     12 from conf import setting
     13 from .logger import logger_log
     14 from .mythread import Mythread
     15 from threading import Thread
     16 import queue
     17 access_log = logger_log('access')
     18 
     19 class Ftpserver:
     20     STATUS_CODE ={
     21         200: "Passed authentication!",
     22         201: "Wrong username or password!",
     23         300: "File does not exist !",
     24         301: "File exist , and this msg include the file size- !",
     25         302: "This msg include the msg size!",
     26         350: "Dir changed !",
     27         351: "Dir doesn't exist !",
     28         401: "File exist ,ready to re-send !",
     29         402: "File exist ,but file size doesn't match!",
     30         404: "File created successfully!",
     31         405: "File deleted successfully!",
     32         406: "File already exists!",
     33         407: "File does not exist !",
     34         500: 'Folder deletion succeeded!',
     35         501: 'Folder does not exist!'
     36     }
     37     def __init__(self,mangement_instantiation):
     38         self.mangement_instantiation = mangement_instantiation
     39         self.socket = socket.socket(setting.address_family,setting.socket_type)
     40         self.socket.bind((setting.SERVER_ADDR,setting.SERVER_PORT))
     41         self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     42         self.socket.listen(setting.request_queue_size)
     43         self.pool = Mythread(setting.THREAD_SIZE)
     44         self.account = self.load_accuont()
     45         self.user_obj = None
     46         self.user_client = None
     47         self.user_disk = None
     48         self.username = None
     49 
     50 
     51 
     52     def run(self):
     53         '''启动FTP服务器'''
     54         print('start FTPserver on %s:%s'.center(50,'*')%(setting.SERVER_ADDR,setting.SERVER_PORT))
     55         while True:
     56             try:
     57                 request,self.addr = self.socket.accept()
     58                 # self.request = request
     59                 print('got ab new connection form %s...'%(self.addr,))
     60                 t = self.pool.get_queue()
     61                 obj = t(target=self.handler,args=(request,))
     62                 obj.start()
     63             except Exception:
     64                 break
     65 
     66     def load_accuont(self):
     67         '''读取用户数据'''
     68         config_obj = configparser.ConfigParser()
     69         config_obj.read(setting.ACCOUNT_INI)
     70         print(config_obj.sections())
     71         return config_obj
     72 
     73     def authentication(self,username,password):
     74         '''验证用户账户'''
     75         if username in self.account:
     76             _password = self.account[username]['password']
     77             md5_obj = hashlib.md5()
     78             md5_obj.update(password.encode('utf-8'))
     79             md5_password = md5_obj.hexdigest()
     80             if md5_password == _password:
     81                 # print('登陆成功!')
     82                 self.user_obj = self.account[username]
     83                 self.user_obj['home'] = os.path.join(setting.HOME_DIR,username)
     84                 self.user_client = self.user_obj['home']
     85                 self.user_disk = self.account[username]['file_disk']
     86                 access_log.info('%s 成功登陆了FTP服务器,IP地址:%s,'%(username,self.addr))
     87                 return True
     88             else:
     89                 print('登陆失败')
     90                 access_log.error('%s 尝试登陆FTP服务器,IP地址:%s,'%(username,self.addr))
     91                 return False
     92         else:
     93             print('登陆失败!')
     94             access_log.error('%s 尝试登陆FTP服务器,IP地址:%s,' % (username, self.addr))
     95             return False
     96     def handler(self,request):
     97         '''处理用户交互'''
     98         while True:
     99             try:
    100                 raw_data = request.recv(4)
    101                 if not raw_data:
    102                     self.pool.put_queue()
    103                 data_size = struct.unpack('i',raw_data)[0]
    104                 data_bytes = request.recv(data_size)
    105                 data = json.loads(data_bytes.decode('utf-8'))
    106                 action_type = data.get('action_type')
    107                 if action_type:
    108                     if hasattr(self,'_%s'%action_type):
    109                         func = getattr(self,'_%s'%action_type)
    110                         func(data,request)
    111             except Exception:
    112                 break
    113 
    114 
    115     def send_response(self,status_code,*args,**kwargs):
    116         '''发送消息给客户端'''
    117         conn = args[0]
    118         data = kwargs
    119         data['status_code'] = status_code
    120         data['status_msg'] = self.STATUS_CODE[status_code]
    121         bytes_data = json.dumps(data).encode('utf-8')
    122         data_struct = struct.pack('i',len(bytes_data))
    123         conn.send(data_struct)
    124         conn.send(bytes_data)
    125 
    126     def _auth(self,data,*args,**kwargs):
    127         '''处理用户认证'''
    128         conn = args[0]
    129         if self.authentication(data.get('username'),data.get('password')):
    130             print('登陆成功')
    131             self.send_response(200,conn)
    132         else:
    133             self.send_response(201,conn)
    134 
    135     def _get(self,data,*args):
    136         '''接收客户端下载'''
    137         conn = args[0]
    138         filename = data.get('filename')
    139         full_path = os.path.join(self.user_client,filename)
    140         if os.path.isfile(full_path):
    141             file_size = os.stat(full_path).st_size
    142             self.send_response(301,conn,file_size=file_size)
    143             print('准备发送!')
    144             with open(full_path,'rb') as f:
    145                 for line in f:
    146                         conn.send(line)
    147                 else:
    148                     print('文件发送成功')
    149                     access_log.info('%s 下载了文件%s,IP地址:%s,'% (self.user_obj['username'],filename,self.addr))
    150         else:
    151             self.send_response(300,conn)
    152             access_log.info('%s 下载文件%s失败,IP地址:%s,' % (self.user_obj['username'],filename,self.addr))
    153 
    154     def _put(self,data,*args):
    155         conn = args[0]
    156         filename = data.get('filename')
    157         full_path = os.path.join(self.user_client, filename)
    158         if os.path.isfile(full_path):
    159             filename = '%s.%s'%(full_path,time.time())
    160         else:
    161             filename = full_path
    162         with open(filename,'wb') as f:
    163             total_size = data.get('file_size')
    164             recv_size = 0
    165             while recv_size < total_size:
    166                 recv_data = conn.recv(1024)
    167                 f.write(recv_data)
    168                 recv_size += len(recv_data)
    169                 print('总大小:%s,已接收:%s'%(total_size,recv_size))
    170             else:
    171                 print('接收成功')
    172                 access_log.info('%s 上传了文件%s,IP地址:%s,' % (self.user_obj['username'], filename,self.addr))
    173 
    174     def _ls(self,data,*args):
    175         '''查看'''
    176         conn = args[0]
    177         cmd_obj = subprocess.Popen('dir %s'%self.user_client,shell=True,
    178                                    stdout=subprocess.PIPE,
    179                                    stderr=subprocess.PIPE)
    180         stdout = cmd_obj.stdout.read()
    181         stderr = cmd_obj.stderr.read()
    182         request = stdout + stderr
    183         if not request:
    184            request = bytes('此目录无文件!')
    185         self.send_response(302,conn,cmd_size=len(request))
    186         conn.sendall(request)
    187 
    188     def _mkdir(self,data,*args):
    189         '''创建文件夹'''
    190         conn = args[0]
    191         filename = data.get('inp')
    192         full_path = os.path.abspath(os.path.join(self.user_client,filename))
    193         cmd_obj = subprocess.Popen('mkdir  %s'%(full_path),shell=True,
    194                                    stdout=subprocess.PIPE,
    195                                    stderr=subprocess.PIPE)
    196         stdout = cmd_obj.stdout.read()
    197         stderr = cmd_obj.stderr.read()
    198         request = stderr + stdout
    199         if request:
    200             self.send_response(406,conn)
    201         self.send_response(404,conn,cmd_mkdir=len(request))
    202         conn.sendall(request)
    203         access_log.info('%s 成功创建文件%s,IP地址:%s,' % (self.user_obj['username'],filename,self.addr))
    204     def _del(self,data,*args):
    205         '''删除文件'''
    206         conn = args[0]
    207         del_name = data.get('del_name')
    208         full_path = os.path.abspath(os.path.join(self.user_client,del_name))
    209         cmd_obj = subprocess.Popen('del  %s'%(full_path),shell=True,
    210                                    stdout=subprocess.PIPE,
    211                                    stderr=subprocess.PIPE)
    212         stdout = cmd_obj.stdout.read()
    213         stderr = cmd_obj.stderr.read()
    214         request = stderr + stdout
    215         if not request:
    216            self.send_response(407,conn)
    217         self.send_response(405,conn,del_mkdir=len(request))
    218         conn.sendall(request)
    219         access_log.info('%s 成功删除文件%s,IP地址:%s,' % (self.user_obj['username'], del_name, self.addr))
    220 
    221     def _rm(self,data,*args):
    222         '''删除文件夹'''
    223         conn = args[0]
    224         rm_name = data.get('rm_name')
    225         full_path = os.path.abspath(os.path.join(self.user_client,rm_name))
    226         cmd_obj = subprocess.Popen('rd %s'%(full_path),shell=True,
    227                                    stdout=subprocess.PIPE,
    228                                    stderr=subprocess.PIPE)
    229         stdout = cmd_obj.stdout.read()
    230         stderr = cmd_obj.stderr.read()
    231         request = stderr + stdout
    232         if not request:
    233            self.send_response(501,conn)
    234         self.send_response(500,conn,rm_mkdir=len(request))
    235         conn.sendall(request)
    236         access_log.info('%s 成功删除文件%s,IP地址:%s,' % (self.user_obj['username'], rm_name, self.addr))
    237 
    238     def _cd(self,data,*args):
    239         '''切换目录'''
    240         conn = args[0]
    241         target = data.get('target_dir')
    242         full_path = os.path.abspath(os.path.join(self.user_client,target))
    243         if os.path.isdir(full_path):
    244             if full_path.startswith(self.user_obj['home']):
    245                 self.user_client = full_path
    246                 relative_dir = self.user_client.replace(self.user_obj['home'],'')
    247                 self.send_response(350,conn,current_dir=relative_dir)
    248             else:
    249                 self.send_response(351,conn)
    250         else:
    251             self.send_response(351,conn)
    252 
    253     def _re_get(self,data,*args):
    254         conn = args[0]
    255         filename = data.get('filename')
    256         file_size = data.get('file_size')
    257         full_path = os.path.join(self.user_client,filename.strip('\'))
    258         if os.path.isfile(full_path):
    259             if os.path.getsize(full_path) == file_size:
    260                 self.send_response(401,filename=filename)
    261                 with open(full_path,'rb') as f:
    262                     f.seek(data.get('recveived_size'))
    263                     for line in f:
    264                         conn.send(line)
    265                     else:
    266                       print('发送完毕!')
    267             else:
    268                self.send_response(402,conn)
    269         else:
    270             self.send_response(300,conn)
    View Code

    main_server.py

     1 #!/usr/bin/env python3
     2 # -*- coding:utf-8 -*-
     3 
     4 from .main import Ftpserver
     5 
     6 class Mangement:
     7 
     8     def __init__(self,sys_argv):
     9         '''解析指令,调用相应的模块'''
    10         self.sys_argv = sys_argv
    11         print(sys_argv)
    12         self.verify_argv()
    13 
    14     def verify_argv(self):
    15         '''验证指令是否合法'''
    16         if len(self.sys_argv) <2:
    17             self.help_msg()
    18         cmd = self.sys_argv[1]
    19         if not hasattr(self,cmd):
    20             print('输入错误!')
    21             self.help_msg()
    22 
    23     def help_msg(self):
    24         msg = '''
    25         start      start FTP server
    26         stop       stop FTP server
    27         restart    restart FTP server      
    28         '''
    29         exit(msg)
    30 
    31     def execute(self):
    32         cmd = self.sys_argv[1]
    33         func = getattr(self,cmd)
    34         func()
    35 
    36     def start(self):
    37         server = Ftpserver(self)
    38         server.run_forever()
    View Code

    client.py

      1 #!/usr/bin/env python3
      2 # -*- coding:utf-8 -*-
      3 
      4 import socket
      5 import struct
      6 import os
      7 import json
      8 import optparse
      9 import shelve
     10 
     11 class Myclient:
     12     def __init__(self):
     13         self.username = None
     14         self.terminal_dis = None
     15         self.current_dir = None
     16         self.shelve_obj = shelve.open('.')
     17         parser = optparse.OptionParser()
     18         parser.add_option("-s","--server", dest="server", help="ftp server ip_addr")
     19         parser.add_option("-P","--port",type="int", dest="port", help="ftp server port")
     20         parser.add_option("-u","--username", dest="username", help="username info")
     21         parser.add_option("-p","--password", dest="password", help="password info")
     22         self.options , self.args = parser.parse_args()
     23         self.arvs_verify()
     24         self.make_connt()
     25 
     26     def arvs_verify(self):
     27         '''检查命令的合法性'''
     28         if not self.options.server or not self.options.port:
     29             print('缺少必要的参数!')
     30 
     31     def make_connt(self):
     32         '''建立链接'''
     33         self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     34         self.sock.connect((self.options.server,self.options.port))
     35 
     36     def get_response(self):
     37         data = self.sock.recv(4)
     38         hear_size = struct.unpack('i',data)[0]
     39         hear_bytes = self.sock.recv(hear_size)
     40         hear_dic = json.loads(hear_bytes)
     41         return hear_dic
     42 
     43     def auth(self):
     44         count = 0
     45         while count < 3:
     46             username = input('请输入账号:').strip()
     47             password = input('请输入密码:').strip()
     48             auth_info = {
     49                 'action_type':'auth',
     50                 'username':username,
     51                 'password':password,
     52             }
     53             hear_json = json.dumps(auth_info)
     54             hear_bytes = hear_json.encode('utf-8')
     55             self.sock.send(struct.pack('i', len(hear_bytes)))
     56             self.sock.send(hear_bytes)
     57             response = self.get_response()
     58             if response.get('status_code') == 200:
     59                 self.username = username
     60                 self.terminal_dis = '[%s]>>'%self.username
     61                 self.current_dir = '\'
     62                 print('登陆成功!')
     63                 msg = '''
     64                       del      删除文件
     65                       ls       查看当前文件
     66                       cd       切换目录
     67                       mkdir    创建文件夹
     68                       put      上传文件
     69                       get      下载文件
     70                       rm        删除文件夹
     71                   '''
     72                 print(msg)
     73                 return  True
     74             else:
     75                 print(response.get('status_msg'))
     76                 count += 1
     77 
     78     def file_check(self):
     79         if  list(self.shelve_obj.keys()):
     80             print('未下载成功的列表'.center(50,'*'))
     81             for index,abs_file in enumerate(self.shelve_obj.keys()):
     82                 print(self.shelve_obj[abs_file][1])
     83                 recv_size = os.path.getsize(self.shelve_obj[abs_file][1])
     84                 print(' %s.%s  %s  %s   %s'%(index,abs_file,
     85                                              self.shelve_obj[abs_file][0],
     86                                              recv_size,
     87                                              recv_size/self.shelve_obj[abs_file][0]*100))
     88 
     89             while True:
     90                 choice = input('请选择继续下载的文件:').strip()
     91                 if not choice:continue
     92                 if choice == 'back':break
     93                 if choice.isdigit():
     94                     choice = int(choice)
     95                     if choice >=0 and choice <= index:
     96                         selected_file = list(self.shelve_obj.keys())[choice]
     97                         already_rec_size = os.path.getsize(self.shelve_obj[selected_file][1])
     98                         self.send_msg('re_get',file_size=self.shelve_obj[selected_file][0],
     99                                       filename=selected_file,
    100                                       recveived_size=already_rec_size)
    101                         response = self.get_response()
    102                         new_filename = response.get('filename').strip('\')
    103                         if response.get('status_code') == 401:
    104                             local_filename = self.shelve_obj[selected_file][1]
    105                             with open(local_filename,'ab') as f:
    106                                 total_size = self.shelve_obj[selected_file][0]
    107                                 recv_size = already_rec_size
    108                                 current_percent = int(recv_size / total_size * 100)
    109                                 progress_generator = self.progress_bar(total_size,
    110                                                                        current_percent,current_percent)
    111                                 progress_generator.__next__()
    112                                 while recv_size < total_size:
    113                                     res = self.sock.recv(1024)
    114                                     f.write(res)
    115                                     recv_size += len(res)
    116                                     progress_generator.send(recv_size)
    117                                 else:
    118                                     print('下载完毕')
    119                                     del self.shelve_obj[selected_file]
    120                             os.rename(local_filename, new_filename)
    121 
    122                         else:
    123                             print(response.get('status_msg'))
    124 
    125 
    126 
    127     def interactive(self):
    128         if self.auth():
    129             self.file_check()
    130             while True:
    131                 user_input = input(self.terminal_dis).strip()
    132                 if not user_input:continue
    133                 cmd_list = user_input.split()
    134                 if hasattr(self,'_%s'%cmd_list[0]):
    135                     func = getattr(self,'_%s'%cmd_list[0])
    136                     func(cmd_list[1:])
    137 
    138 
    139     def send_msg(self,acttion_type,*args,**kwargs):
    140         '''将消息发送到远程'''
    141         my_data = {
    142             'action_type':acttion_type
    143 
    144         }
    145         my_data.update(kwargs)
    146         hear_json = json.dumps(my_data)
    147         hear_bytes = hear_json.encode('utf-8')
    148         self.sock.send(struct.pack('i',len(hear_bytes)))
    149         self.sock.send(hear_bytes)
    150 
    151     def parameter_check(self, args, min_args=None, max_args=None, exact_args=None):
    152         """参数个数合法性检查"""
    153         if min_args:
    154             if len(args) < min_args:
    155                 print("must provide at least %s parameters but %s received." %(min_args,len(args)))
    156                 return False
    157         if max_args:
    158             if len(args) > max_args:
    159                 print("need at most %s parameters but %s received." %(max_args,len(args)))
    160                 return False
    161         if exact_args:
    162             if len(args) != exact_args:
    163                 print("need exactly %s parameters but %s received." % (exact_args, len(args)))
    164                 return False
    165         return True
    166 
    167     def progress_bar(self,total_size,current_percent=0,last_percent=0):
    168         '''进度条'''
    169         while True:
    170             received_size = yield current_percent
    171             current_percent = int(received_size /total_size * 100)
    172             if current_percent > last_percent:
    173                 print('>' * int(current_percent / 2) + '{percnet}%'.format(percnet=current_percent),end='
    ',
    174                       flush=True)
    175                 last_percent = current_percent
    176 
    177     def _get(self,cmd_argv):
    178         '''下载文件'''
    179         if self.parameter_check(cmd_argv,min_args=1):
    180             filename = cmd_argv[0]
    181             self.send_msg(acttion_type='get',filename=filename)
    182             response = self.get_response()
    183             if response.get('status_code') == 301:
    184                 file_size = response.get('file_size')
    185                 recv_size = 0
    186                 progress_gen = self.progress_bar(file_size)
    187                 progress_gen.__next__()
    188 
    189                 file_abs_path = os.path.join(self.current_dir,filename)
    190                 self.shelve_obj[file_abs_path] = [file_size,'%s.download'%filename]
    191 
    192                 with open('%s.download'%filename,'wb') as f:
    193                     while recv_size < file_size:
    194                         res = self.sock.recv(1024)
    195                         recv_size += len(res)
    196                         f.write(res)
    197                         progress_gen.send(recv_size)
    198                     else:
    199                         print('
    ')
    200                         print('下载成功!')
    201                         del self.shelve_obj[file_abs_path]
    202                 os.rename('%s.download'%filename,filename)
    203             else:
    204                 print(response.get('status_msg'))
    205 
    206 
    207 
    208 
    209     def _put(self,cmd_argv):
    210         '''上传文件'''
    211         if self.parameter_check(cmd_argv,exact_args=1):
    212             filename = cmd_argv[0]
    213             if os.path.isfile(filename):
    214                 file_size = os.path.getsize(filename)
    215                 self.send_msg(acttion_type='put',file_size=file_size,filename=filename)
    216                 print('准备发送')
    217                 send_size = 0
    218                 progress_gen = self.progress_bar(file_size)
    219                 progress_gen.__next__()
    220                 with open(filename,'rb') as f:
    221                     for line in f:
    222                         self.sock.send(line)
    223                         send_size += len(line)
    224                         progress_gen.send(send_size)
    225 
    226                     else:
    227                         print('
    ')
    228                         print('上传成功!')
    229 
    230 
    231     def _ls(self,cmd_argv):
    232         '''查看'''
    233         self.send_msg(acttion_type='ls')
    234         response = self.get_response()
    235         if response.get('status_code') == 302:
    236             cmd_size = response.get('cmd_size')
    237             recv_size = 0
    238             cmd_result = b''
    239             while recv_size < cmd_size:
    240                 res = self.sock.recv(1024)
    241                 cmd_result += res
    242                 recv_size += len(res)
    243             else:
    244                 print(cmd_result.decode('gbk'))
    245 
    246 
    247     def _mkdir(self,cmd_argv):
    248         '''创建文件夹'''
    249         if self.parameter_check(cmd_argv,exact_args=1):
    250             inp = cmd_argv[0]
    251             self.send_msg(acttion_type='mkdir',inp=inp)
    252             response = self.get_response()
    253             if response.get('status_code') == 404:
    254                 print(response.get('status_msg'))
    255             elif response.get('status_code') == 406:
    256                 print(response.get('status_msg'))
    257 
    258     def _del(self,cmd_argv):
    259         '''删除文件'''
    260         if self.parameter_check(cmd_argv,exact_args=1):
    261             del_name = cmd_argv[0]
    262             self.send_msg(acttion_type='del',del_name=del_name)
    263             response = self.get_response()
    264             if response.get('status_code') == 405:
    265                 print(response.get('status_msg'))
    266             elif response.get('status_code') == 407:
    267                 print(response.get('status_msg'))
    268 
    269     def _rm(self,cmd_argv):
    270         '''删除文件夹'''
    271         if self.parameter_check(cmd_argv,exact_args=1):
    272             rm_name = cmd_argv[0]
    273             self.send_msg(acttion_type='rm',rm_name=rm_name)
    274             response = self.get_response()
    275             if response.get('status_code') == 500:
    276                 print(response.get('status_msg'))
    277             elif response.get('status_code') == 501:
    278                 print(response.get('status_msg'))
    279 
    280     def _cd(self,cmd_argv):
    281         '''切换目录'''
    282         if self.parameter_check(cmd_argv,exact_args=1):
    283             target_dir = cmd_argv[0]
    284             self.send_msg(acttion_type='cd',target_dir=target_dir)
    285             response = self.get_response()
    286             if response.get('status_code') == 350:
    287                 self.terminal_dis = '[[%s]>>\%s]'% (self.username,response.get('current_dir'))
    288                 self.current_dir = response.get('current_dir')
    289 
    290 
    291 
    292 
    293 
    294 if __name__ == '__main__':
    295     obj = Myclient()
    296     obj.interactive()
    View Code

     mythread.py

     1 #!/usr/bin/env python3
     2 # -*- coding:utf-8 -*-
     3 from threading import Thread
     4 import queue
     5 
     6 class Mythread:
     7     '''自定义线程池,实现并发'''
     8     def __init__(self,maxsize):
     9         self.maxsize = maxsize
    10         self.q = queue.Queue(maxsize) #  初始一个队列对象
    11         for i in range(maxsize):
    12             self.q.put(Thread) # 在队列对象中先存放线程对象
    13 
    14     def get_queue(self):
    15         '''从队列中取出线程对象'''
    16         return self.q.get()
    17 
    18     def put_queue(self):
    19         '''往队列存放线程对象'''
    20         return self.q.put(Thread)
    View Code
  • 相关阅读:
    Timer类的常见使用方法
    转:HTTP协议简介
    DS-5新加交叉编译工具
    C++的引用
    C++构造函数的几种使用方法
    Eclipse 快捷键
    eclipse Outline里图标的含义
    Linux 内存映射函数 mmap()函数详解
    Sockit 硬件接口编程——点亮一个LED
    更新Preloader与uboot
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/9186352.html
Copyright © 2020-2023  润新知