高级FTP服务器 1. 用户加密认证 2. 多用户同时登陆 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额、不同用户配额可不同 5. 用户可以登陆server后,可切换目录 6. 查看当前目录下文件 7. 上传下载文件,保证文件一致性 8. 传输过程中现实进度条 9.支持断点续传 10.用户操作日志 服务端 启动参数 start 客户端 启动参数 -s localhost -P 9500 程序结构: seniorFTP/#综合目录 |- - -ftp_client/#客户端程序目录 | |- - -__init__.py | |- - -bin/#启动目录 | | |- - -__init__.py | | |- - -client_ftp.py#客户端视图启动 | | | |- - -cfg/#配置目录 | | |- - -__init__.py | | |- - -config.py#配置文件 | | | |- - -down/#下载文件目录 | | | |- - -putfile/#上传文件目录 | | | | | |- - -REDMAE |- - -ftp_server/#服务端程序目录 | |- - -__init__.py | |- - -bin/#启动目录 | | |- - -__init__.py | | |- - -start.py#服务端视图启动 | | |- - -user_reg.py#用户注册启动 | | | |- - -cfg/#配置目录 | | |- - -__init__.py | | |- - -config.py#配置文件 | | |- - -userpwd.cfg#用户信息文件 | | | |- - -core/#文件目录 | | |- - -__init__.py | | |- - -ftp_server.py#服务端主要逻辑 类
| | |- - -logs.py#日志主要逻辑 类
| | |- - -main.py#服务端启动主程序 | | | |- - -home/#用户文件目录 | | |- - -用户/#个人目录 | | | |- - -log/#日志文件目录 | | | |- - -REDMAE | | | |- - -REDMAE 先上流程图:
详细代码如下: |- - -ftp_client/#客户端程序目录 | |- - -__init__.py | |- - -bin/#启动目录 | | |- - -__init__.py | | |- - -client_ftp.py#客户端视图启动
<br>


1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import socket,os,json,getpass,hashlib 5 import os ,sys,optparse 6 7 STATUS_CODE={ 8 240:'格式出错,格式:{"action":"get","filename":"filename","size":100}', 9 241:'指令错误', 10 242:'用户密码出错', 11 243:'用户或密码出错', 12 244:'用户密码通过校验', 13 } 14 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 15 sys.path.append(BASE_DIR)#增加环境变量 16 from cfg import config 17 class FTPClient(object): 18 def __init__(self): 19 paresr=optparse.OptionParser() 20 paresr.add_option('-s','--server',dest='server',help='服务器地址') 21 paresr.add_option('-P','--port',type="int",dest='port',help='服务器端口') 22 paresr.add_option('-u','--username',dest='username',help='用户名') 23 paresr.add_option('-p','--password',dest='password',help='密码') 24 (self.options,self.args)=paresr.parse_args()#返回一个字典与列表的元组 25 self.verify_args(self.options,self.args)#判断参数 26 self.ser_connect()#连接服务端 27 self.cmd_list=config.CMD_LIST 28 self.rat=0#文件断点 29 30 #实例化一个连接端 31 def ser_connect(self): 32 self.c=socket.socket()#实例化一个连接端 33 self.c.connect((self.options.server,self.options.port))#进行连接 34 35 #判断用户与密码是否成对出现 36 def verify_args(self,options,args): 37 if (options.username is None and options.password is None) or (options.username is not None and options.password is not None):#判断用户与密码是否成对出现 38 pass##判断用户与密码单个出现 39 else: 40 exit('出错:请输入用户与密码!')#退出 41 if options.server and options.port:#端口判断 42 if options.port>0 and options.port指令>>>:'%self.user_dir).strip()131 if len(cmd)==0:continue#输入空跳过132 if cmd=='exit':exit()#退出指令133 cmd_str=cmd.split()#用空格分割 取命令到列表134 #print(cmd_str)135 #print(len(cmd_str))136 if len(cmd_str)==1 and cmd_str[0] in self.cmd_list:#如果是单个命令 并且在命令列表中137 #if len(cmd_str)==1:#如果是单个命令 并且在命令列表中138 if cmd_str[0]==config.HELP:139 self.help()140 continue141 func=getattr(self,'cmd_compr')#调用此方法142 ret=func(cmd_str)143 if ret:144 continue145 else:146 pass147 elif len(cmd_str)>1:148 if hasattr(self,'cmd_%s'%cmd_str[0]):#判断类中是否有此方法149 func=getattr(self,'cmd_%s'%cmd_str[0])#调用此方法150 func(cmd_str)#执行151 continue152 else:153 print('指令出错!')154 self.help()#155 156 #'''是否要md5'''157 def cmd_md5_(self,cmd_list):158 '''是否要md5'''159 if '--md5' in cmd_list:160 return True161 162 #进度条163 def show_pr(self,total):#进度条164 received_size = 0 #发送的大小165 current_percent = 0 #166 while received_size current_percent :168 print("#",end="",flush=True)#进度显示169 current_percent = int((received_size / total) * 100 )170 new_size = yield #断点跳转 传入的大小171 received_size += new_size172 173 #单个命令174 def cmd_compr(self,cmd_str,**kwargs):175 mag_dict={176 "action":"compr",177 'actionname':cmd_str[0]178 }179 self.c.send(json.dumps(mag_dict).encode('utf-8'))#发送数据180 cmd_res_attr=self.get_response()#得到服务器的回复181 if type(cmd_res_attr) is not int:#如果不int 类型182 if cmd_res_attr["status_code"] ==241:#命令不对183 print(cmd_res_attr['status_msg'])184 return185 if cmd_res_attr["status_code"] ==240:#命令不对186 print(cmd_res_attr['status_msg'])187 return188 size_l=0#收数据当前大小189 self.c.send('准备好接收了,可以发了'.encode('utf-8'))190 receive_data= ''.encode()191 while size_l 1:310 filename=cmd_list[1]#取文件名311 filename_dir=config.PUT_DIR+filename#拼接文件名路径312 313 if os.path.isfile(filename_dir):#是否是一个文件314 filesize=os.stat(filename_dir).st_size#获取文件大小315 #执行行为 名字,大小,是否316 mag_dict={317 "action":"put",318 'filename':filename,319 'size':filesize,320 'overridden':True,321 'md5':False322 }323 if self.cmd_md5_(cmd_list):#判断是否进行MD5324 mag_dict['md5'] = True325 self.c.send(json.dumps(mag_dict).encode('utf-8'))#发送文件信息326 data=self.get_response()#得到服务器的回复327 if data["status_code"] ==250:#磁盘空间不足328 print(data['status_msg'])329 print(mag_dict['size'])330 return331 if data["status_code"] ==249:#磁盘空间足够332 print(data['status_msg'])333 print('剩余空间',data['剩余空间'])334 self.c.send(b'1')#发送到服务器,表示可以上传文件了335 data=self.get_response()#得到服务器的回复336 if data["status_code"] ==230:#断点续传337 print(data['status_msg'])338 print(data['文件大小'])339 self.rat=data['文件大小']#文件指针位置340 pass341 elif data["status_code"] ==231:#非断点续传342 print(data['status_msg'])343 self.rat=0#文件指针位置344 pass345 f=open(filename_dir,'rb')#打开文件346 f.seek(self.rat)#移动到位置347 print(mag_dict['md5'])348 self.c.send(b'1')#发送到服务器,表示可以上传文件了349 if mag_dict['md5']==True:350 md5_obj = hashlib.md5()#定义MD5351 progress = self.show_pr(mag_dict['size']) #进度条 传入文件大小352 progress.__next__()353 while self.rat<354> '' '' '' '' '' '' '' '' '' '' '' '' </354>


'' '' '' ''''''''


''


'' '' '''' '' '' '' '' ''


'' '' '' '' '' '' '' '' '' '' '' ''


'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '''''' '''''' '' '' '' '' '' '' '' '' ''''' '''''' '' '' '' '' '' '' '' '' '' '' '' '' '''' '' '' '' '''' '''' '' ''' ''' ''' ''' '' '' '' '' '' '' '' '' '' '' '' '''' '' '' '''' '' ''' ''' '' '''' '' '' '' '' '' '' '' <271></271>


'' '' ' '' ' '' '' ' '' '


'''''''' '''''''' '''''' '' ''
<br><br>
<br>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

La flexibilité de Python se reflète dans les systèmes de prise en charge et de type dynamique multi-paradigmes, tandis que la facilité d'utilisation provient d'une syntaxe simple et d'une bibliothèque standard riche. 1. Flexibilité: prend en charge la programmation orientée objet, fonctionnelle et procédurale, et les systèmes de type dynamique améliorent l'efficacité de développement. 2. Facilité d'utilisation: La grammaire est proche du langage naturel, la bibliothèque standard couvre un large éventail de fonctions et simplifie le processus de développement.

Python est très favorisé pour sa simplicité et son pouvoir, adaptés à tous les besoins des débutants aux développeurs avancés. Sa polyvalence se reflète dans: 1) Facile à apprendre et à utiliser, syntaxe simple; 2) Bibliothèques et cadres riches, tels que Numpy, Pandas, etc.; 3) Support multiplateforme, qui peut être exécuté sur une variété de systèmes d'exploitation; 4) Convient aux tâches de script et d'automatisation pour améliorer l'efficacité du travail.

Oui, apprenez Python en deux heures par jour. 1. Élaborer un plan d'étude raisonnable, 2. Sélectionnez les bonnes ressources d'apprentissage, 3. Consolider les connaissances apprises par la pratique. Ces étapes peuvent vous aider à maîtriser Python en peu de temps.

Python convient au développement rapide et au traitement des données, tandis que C convient à des performances élevées et à un contrôle sous-jacent. 1) Python est facile à utiliser, avec syntaxe concise, et convient à la science des données et au développement Web. 2) C a des performances élevées et un contrôle précis, et est souvent utilisé dans les jeux et la programmation système.

Le temps nécessaire pour apprendre le python varie d'une personne à l'autre, principalement influencé par l'expérience de programmation précédente, la motivation d'apprentissage, les ressources et les méthodes d'apprentissage et le rythme d'apprentissage. Fixez des objectifs d'apprentissage réalistes et apprenez mieux à travers des projets pratiques.

Python excelle dans l'automatisation, les scripts et la gestion des tâches. 1) Automatisation: La sauvegarde du fichier est réalisée via des bibliothèques standard telles que le système d'exploitation et la fermeture. 2) Écriture de script: utilisez la bibliothèque PSUTIL pour surveiller les ressources système. 3) Gestion des tâches: utilisez la bibliothèque de planification pour planifier les tâches. La facilité d'utilisation de Python et la prise en charge de la bibliothèque riche en font l'outil préféré dans ces domaines.

Pour maximiser l'efficacité de l'apprentissage de Python dans un temps limité, vous pouvez utiliser les modules DateTime, Time et Schedule de Python. 1. Le module DateTime est utilisé pour enregistrer et planifier le temps d'apprentissage. 2. Le module de temps aide à définir l'étude et le temps de repos. 3. Le module de planification organise automatiquement des tâches d'apprentissage hebdomadaires.

Python excelle dans les jeux et le développement de l'interface graphique. 1) Le développement de jeux utilise Pygame, fournissant des fonctions de dessin, audio et d'autres fonctions, qui conviennent à la création de jeux 2D. 2) Le développement de l'interface graphique peut choisir Tkinter ou Pyqt. Tkinter est simple et facile à utiliser, PYQT a des fonctions riches et convient au développement professionnel.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

SublimeText3 Linux nouvelle version
Dernière version de SublimeText3 Linux

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft