高级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>
以上が高度な FTP サーバーの使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。
