搜尋
首頁後端開發Python教學簡單FTP的實作詳解

簡單FTP的實作詳解

Jun 21, 2017 pm 04:47 PM
python一天作業簡單

 

作业要示:

开发简单的FTP:
1. 用户登陆
2. 上传/下载文件
3. 不同用户家目录不同
4. 查看当前目录下文件
5. 充分使用面向对象知识

 

 

 REDMAE

 1 用户登陆 2  3 1、查看用户目录文件 4 2、上传文件, 5 3、下载方件 6 4、退出 7  8 程序结构: 9 socket_server_client/#程序目录10 |- - -clients/#client程序主目录11 |      |- - -__init__.py12 |      |- - -bin/#启用目录13 |      |       |- - - __init__.py14 |      |       |- - -socket_client.py#客户端启动15 |      |16 |      |- - -cfg/#配置文件目录17 |      |       |- - - __init__.py18 |      |       |- - -config.py#配置文件19 |      |20 |      |- - -core/#主要程序目录21 |      |       |- - - __init__.py22 |      |       |- - -client_func.py#主要函数23 |      |24 |      |- - -home/#客户端下载文件目录25 |26 |- - -servers/#server程序主目录27 |      |- - -__init__.py28 |      |- - -bin/#启用目录29 |      |       |- - - __init__.py30 |      |       |- - -registration.py#用户注册31 |      |       |- - -socket_server.py#服务端启动32 33 |      |34 |      |- - -cfg/#配置文件目录35 |      |       |- - - __init__.py36 |      |       |- - -config.py#配置文件37 |      |38 |      |- - -core/#主要程序目录39 |      |       |- - - __init__.py40 |      |       |- - -server_classc.py#主要函数41 |      |42 |      |- - -db/#用户上传文件主目录43 |              |- - -user_file/#用户上传目录44 |              |- - -user_names#注册用户文件45 |

 

服务端

servers/

    bin/

registration.py

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import socket,os,json,sys,pickle 5  6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 7 sys.path.append(BASE_DIR)#增加环境变量 8 from cfg import config 9 print('用户注册'.center(60,'='))10 while True:11     user_=input('请输入您要注册的用户名:').strip()12     user_dir=os.path.join(config.USER_DIR,user_)#拼接用户目录路径13     if os.path.isdir(user_dir):# 判断一个目录是否存在14         print('用户已经存在请重输!')15         continue16     else:17         pwd_=input('请输入密码:').strip()18         pwd_two=input('请确认密码:').strip()19         if pwd_==pwd_two:20             try:21                 os.mkdir(user_dir)#创建目录22             except Exception as e:23                 print(e)24                 continue25             finally:26                 file_dir=user_dir+'\\user'#用户目录下的用户名文件27             if  not os.path.isfile(config.USER_FILE):28                 with open(config.USER_FILE,'w',encoding='utf-8') as f:29                     f.write('{}')30             with open(config.USER_FILE,'r+',encoding='utf-8') as f:31                 data=eval(f.readline())32                 data[user_]=pwd_33                 f.seek(0)34                 f.write(str(data))35             print('用户[%s]注册成功!'%user_)36             exit()
View Code

socket_server.py

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import socket,os,json 5 import sys 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 7 sys.path.append(BASE_DIR)#增加环境变量 8  9 from  core.server_class import listen_func10 s=socket.socket()#定义11 s.bind(('localhost',9000))#绑定要监听的 端口12 s.listen(5)#对列513 print('正在监听中')14 listen_func(s)

cfg/

config.py

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import os ,sys 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 6 sys.path.append(BASE_DIR)#增加环境变量 7  8  9 USER_DIR=BASE_DIR+'\db\\user_file\\'#定义用户目录文件路径变量10 11 USER_FILE=BASE_DIR+'\db\\user_names'#定义用户文件路径变量
View Code

 

core/

server_class.py

  1 #!usr/bin/env python  2 #-*-coding:utf-8-*-  3 # Author calmyan  4 import socket,os,json,sys,pickle  5   6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量  7 sys.path.append(BASE_DIR)#增加环境变量  8   9 from cfg import config 10  11  12 #用户名检测函数 13 def open_file_list(name,pas):#传入当前类 14     with open(config.USER_FILE,'r',encoding='utf-8') as f: 15         data=eval(f.readline()) 16         if name in data and pas==data[name]: 17             return True 18         else: 19             return False 20  21  22 #连接类 23 class socket_server(object): 24     '''连接类''' 25     file_path=config.USER_DIR#用户路经变量 26     def __init__(self,data,conn):#传入用户名,密码 27         self.DATA=data 28         self.conn=conn 29  30  31     def show_process(self,lens): 32         received_size=0#定义大小 33         current_percent=0#当前大小百分比 34         while received_size<lens:>current_percent: 36                 print('#',end='',flush=True) 37                 current_percent=int((received_size/lens)*100) 38             new_size=yield 39             received_size+=new_size 40  41     def ret_l(self): 42         ret=socket_server.login(self.DATA["name"],self.DATA['pwd'],self.conn)#用户名检测 43         return ret 44     def open_f(self,ret):#打开目录 45         file_dir=os.path.join(socket_server.file_path,ret['data']['user'])#用户目录 46         file_name=os.listdir(file_dir)#目录文件列表 47         f=file_dir+self.DATA['filename']##上传的文件名 48         return file_dir,file_name,f#返回 49  50     def ls_file(self,data):#查看文件 51         self.conn.send(json.dumps(data[1]).encode()) 52  53     def send_file(self,data): 54  55         if self.DATA['filename'] in data[1]: 56             f=data[0]+'/'+self.DATA['filename'] 57             file_obj=open(f,"rb")#打开文件 58             name=file_obj.name.split('/')[-1]#文件名 59             sez=os.path.getsize(f)#获取文件大小 60             print(sez) 61             data_header={ 62                     "action":"put", 63                     "filename":name, 64                     "size":sez 65                     } 66             self.conn.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息 67             for line in file_obj: 68                 self.conn.send(line)#发送数据 69  70         elif self.DATA['filename'].isdigit(): 71             num=int(self.DATA['filename'])#转为数字 72             try: 73                 f=data[0]+'/'+data[1][num]# 74                 file_obj=open(f,"rb")#打开文件 75                 name=file_obj.name.split('/')[-1]#文件名 76                 sez=os.path.getsize(f)#获取文件大小 77                 print(sez) 78                 data_header={ 79                 "action":"put", 80                 "filename":name, 81                 "size":sez 82                 } 83                 self.conn.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息 84                 for line in file_obj: 85                     self.conn.send(line)#发送数据 86                 self.conn.send(json.dumps(f).encode())#发送文件 87             except Exception as e: 88                 data={'filename':False} 89                 self.conn.send(json.dumps(data).encode()) 90         else: 91             data={'filename':False} 92             self.conn.send(json.dumps(data).encode()) 93     def put_file(self,data):#上传文件 94         file_obj=open(data[2],'wb')#打开新建 这个文件 95         rece_size=0#定义 文件大小值 96         #prten=socket_server.show_process(self.DATA["size"]) 97         #prten.__next__() 98         while rece_size<self.data></self.data></lens:>
View Code

 

 

客户端

clients/

bin/

socket_client.py

  1 #!usr/bin/env python  2 #-*-coding:utf-8-*-  3 # Author calmyan  4   5 import socket,os,json,sys  6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量  7 sys.path.append(BASE_DIR)#增加环境变量  8 from core.client_func import user_pwd  9 #from core.client_func import show_process 10 from cfg import config 11  12 #进度条 13 def show_process(lens): 14     received_size=0#定义大小 15     current_percent=0#当前大小百分比 16     while received_size<lens:>current_percent: 18             print('#',end='',flush=True) 19             current_percent=int((received_size/lens)*100) 20         new_size=yield 21         received_size+=new_size 22  23  24 client=socket.socket() 25 client.connect(('localhost',9000)) 26 while True: 27     data_d=user_pwd(client) 28     if data_d['tag']:#运行#用户名登陆成功 29         while True: 30             print('''=====指令提示==== 31             查看目录文件: ls 32             下载文件: get 文件名 或 文件编号  如: get test.txt  或  get 1 33             上传方件: put 路径/文件名 如 put e:/test.txt 34             退出:exit 35             ''') 36             cho=input('指令 >>:').strip() 37             if len(cho)==0:continue 38             if cho=='exit':exit()#退出指令 39             cmd_list=cho.split() 40             if cmd_list[0]=='put':#如果等于下载指令 41                 if len(cmd_list)==1: 42                     print('没有输入相关文件名') 43                     continue 44                 filename=cmd_list[1] 45                 if os.path.isfile(filename):#如果文件存在 46                     file_obj=open(filename,"rb")#打开文件 47                     name=file_obj.name.split('/')[-1]#文件名 48                     #name=filename.split("\\")[-1]#文件名 49                     sez=os.path.getsize(filename)#获取文件大小 50                     data_header={ 51                         "action":"put", 52                         "filename":name, 53                         "size":sez 54                     } 55                     client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息 56  57                     print("文件[%s]发送中...."%data_header["filename"]) 58                     for line in file_obj: 59                         client.send(line) 60                     else: 61                         print("文件[%s]发送完毕!"%data_header["filename"]) 62                 else: 63                     print('该文件不存在') 64                     continue 65             elif cmd_list[0]=='get':#如查等 于上传指令 66                 if len(cmd_list)==1: 67                     print('没有输入相关文件名') 68                     continue 69                 filename=cmd_list[1] 70                 print(filename) 71                 data_header={ 72                         "action":"get", 73                         "filename":filename, 74                         "size":'' 75                     } 76                 client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息 77                 datas=client.recv(4096)#接收数据 指令 78                 data_l= json.loads(datas.decode())#反序列 79                 if  not data_l['filename']: 80                     print('文件不存在') 81                     continue 82                 file_dir=config.USER_DIR+data_l["filename"] 83                 file_obj=open(file_dir,'wb')#打开新建 这个文件 84                 rece_size=0#定义 文件大小值 85                 prten=show_process(data_l["size"]) 86                 prten.__next__() 87                 while rece_size<data_l></data_l></lens:>
View Code

 

cfg/

config.py

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4  5 import os ,sys 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量 7 sys.path.append(BASE_DIR)#增加环境变量 8  9 10 USER_DIR=BASE_DIR+'\home\\'#定义用户目录文件路径变量

 

core/

client_func.py

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 import socket,os,json,sys 5 #用户名登陆函数 6 def user_pwd(client): 7     user_=input('请输入用户名:').strip() 8     pwd_=input('请输入密码:').strip() 9     data_header={10                 "action":"user",11                 "name":user_,12                 "pwd":pwd_13             }14     client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息15     data=client.recv(4096)#接收数据 指令16     data_s=json.loads(data.decode('utf-8'))#反序列17     return data_s18 19 20 #进度条21 def show_process(lens):22     received_size=0#定义大小23     current_percent=0#当前大小百分比24     while received_size<25>             ''''                               </25>

 

以上是簡單FTP的實作詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python:遊戲,Guis等Python:遊戲,Guis等Apr 13, 2025 am 12:14 AM

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

Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

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

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

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

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

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

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

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

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

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

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

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

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具