高级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中文網其他相關文章!

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

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應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver CS6
視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。