suchen
HeimBackend-EntwicklungPython-TutorialDetaillierte Erläuterung der einfachen FTP-Implementierung

Detaillierte Erläuterung der einfachen FTP-Implementierung

Jun 21, 2017 pm 04:47 PM
pythoneinmalBetrieb简单

 

作业要示:

开发简单的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>

 

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der einfachen FTP-Implementierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Der Hauptzweck von Python: Flexibilität und BenutzerfreundlichkeitDer Hauptzweck von Python: Flexibilität und BenutzerfreundlichkeitApr 17, 2025 am 12:14 AM

Die Flexibilität von Python spiegelt sich in Multi-Paradigm-Unterstützung und dynamischen Typsystemen wider, während eine einfache Syntax und eine reichhaltige Standardbibliothek stammt. 1. Flexibilität: Unterstützt objektorientierte, funktionale und prozedurale Programmierung und dynamische Typsysteme verbessern die Entwicklungseffizienz. 2. Benutzerfreundlichkeit: Die Grammatik liegt nahe an der natürlichen Sprache, die Standardbibliothek deckt eine breite Palette von Funktionen ab und vereinfacht den Entwicklungsprozess.

Python: Die Kraft der vielseitigen ProgrammierungPython: Die Kraft der vielseitigen ProgrammierungApr 17, 2025 am 12:09 AM

Python ist für seine Einfachheit und Kraft sehr beliebt, geeignet für alle Anforderungen von Anfängern bis hin zu fortgeschrittenen Entwicklern. Seine Vielseitigkeit spiegelt sich in: 1) leicht zu erlernen und benutzten, einfachen Syntax; 2) Reiche Bibliotheken und Frameworks wie Numpy, Pandas usw.; 3) plattformübergreifende Unterstützung, die auf einer Vielzahl von Betriebssystemen betrieben werden kann; 4) Geeignet für Skript- und Automatisierungsaufgaben zur Verbesserung der Arbeitseffizienz.

Python in 2 Stunden am Tag lernen: Ein praktischer LeitfadenPython in 2 Stunden am Tag lernen: Ein praktischer LeitfadenApr 17, 2025 am 12:05 AM

Ja, lernen Sie Python in zwei Stunden am Tag. 1. Entwickeln Sie einen angemessenen Studienplan, 2. Wählen Sie die richtigen Lernressourcen aus, 3. Konsolidieren Sie das durch die Praxis erlernte Wissen. Diese Schritte können Ihnen helfen, Python in kurzer Zeit zu meistern.

Python gegen C: Vor- und Nachteile für EntwicklerPython gegen C: Vor- und Nachteile für EntwicklerApr 17, 2025 am 12:04 AM

Python eignet sich für eine schnelle Entwicklung und Datenverarbeitung, während C für hohe Leistung und zugrunde liegende Kontrolle geeignet ist. 1) Python ist einfach zu bedienen, mit prägnanter Syntax, und eignet sich für Datenwissenschaft und Webentwicklung. 2) C hat eine hohe Leistung und eine genaue Kontrolle und wird häufig bei der Programmierung von Spielen und Systemen verwendet.

Python: zeitliches Engagement und LerntempoPython: zeitliches Engagement und LerntempoApr 17, 2025 am 12:03 AM

Die Zeit, die zum Erlernen von Python erforderlich ist, variiert von Person zu Person, hauptsächlich von früheren Programmiererfahrungen, Lernmotivation, Lernressourcen und -methoden und Lernrhythmus. Setzen Sie realistische Lernziele und lernen Sie durch praktische Projekte am besten.

Python: Automatisierung, Skript- und AufgabenverwaltungPython: Automatisierung, Skript- und AufgabenverwaltungApr 16, 2025 am 12:14 AM

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Python und Zeit: Machen Sie das Beste aus Ihrer StudienzeitPython und Zeit: Machen Sie das Beste aus Ihrer StudienzeitApr 14, 2025 am 12:02 AM

Um die Effizienz des Lernens von Python in einer begrenzten Zeit zu maximieren, können Sie Pythons DateTime-, Zeit- und Zeitplanmodule verwenden. 1. Das DateTime -Modul wird verwendet, um die Lernzeit aufzuzeichnen und zu planen. 2. Das Zeitmodul hilft, die Studie zu setzen und Zeit zu ruhen. 3. Das Zeitplanmodul arrangiert automatisch wöchentliche Lernaufgaben.

Python: Spiele, GUIs und mehrPython: Spiele, GUIs und mehrApr 13, 2025 am 12:14 AM

Python zeichnet sich in Gaming und GUI -Entwicklung aus. 1) Spielentwicklung verwendet Pygame, die Zeichnungen, Audio- und andere Funktionen bereitstellt, die für die Erstellung von 2D -Spielen geeignet sind. 2) Die GUI -Entwicklung kann Tkinter oder Pyqt auswählen. Tkinter ist einfach und einfach zu bedienen. PYQT hat reichhaltige Funktionen und ist für die berufliche Entwicklung geeignet.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung