日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python第四十一天---作业:简单FTP

發布時間:2025/7/14 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python第四十一天---作业:简单FTP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作業要示:

開發簡單的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__.py 12 | |- - -bin/#啟用目錄 13 | | |- - - __init__.py 14 | | |- - -socket_client.py#客戶端啟動 15 | | 16 | |- - -cfg/#配置文件目錄 17 | | |- - - __init__.py 18 | | |- - -config.py#配置文件 19 | | 20 | |- - -core/#主要程序目錄 21 | | |- - - __init__.py 22 | | |- - -client_func.py#主要函數 23 | | 24 | |- - -home/#客戶端下載文件目錄 25 | 26 |- - -servers/#server程序主目錄 27 | |- - -__init__.py 28 | |- - -bin/#啟用目錄 29 | | |- - - __init__.py 30 | | |- - -registration.py#用戶注冊 31 | | |- - -socket_server.py#服務端啟動 32 33 | | 34 | |- - -cfg/#配置文件目錄 35 | | |- - - __init__.py 36 | | |- - -config.py#配置文件 37 | | 38 | |- - -core/#主要程序目錄 39 | | |- - - __init__.py 40 | | |- - -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 continue 16 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 continue 25 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_func 10 s=socket.socket()#定義 11 s.bind(('localhost',9000))#綁定要監聽的 端口 12 s.listen(5)#對列5 13 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: 35 if int((received_size/lens)*100)>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["size"]:#小于接收的文件大小時, 99 recv_data=self.conn.recv(4096) 100 file_obj.write(recv_data)#寫入文件 101 rece_size+=len(recv_data)#增加文件大小計算 102 103 else: 104 print("文件[%s]接收完畢!"%self.DATA["filename"]) 105 file_obj.flush() 106 file_obj.close()#關閉文件 107 108 109 @staticmethod 110 def login(name,pas,conn):#用戶檢測 函數 111 try: 112 if open_file_list(name,pas): 113 tag=True 114 error='' 115 datas={'user':name} 116 data={'mag':'用戶認證通過','tag':True} 117 print(json.dumps(data).encode()) 118 conn.send(json.dumps(data).encode()) 119 else: 120 raise Exception('\033[41;1m用戶名或密碼錯誤\033[0m' %name) 121 except Exception as e: 122 tag=False 123 error=str(e) 124 datas='' 125 data={'mag':'用戶或密碼錯誤','tag':False} 126 print('發送數據%s'%data) 127 conn.send(json.dumps(data).encode()) 128 return {'tag':tag,'error':error,'data':datas} 129 130 #監聽函數 131 def listen_func(s): 132 while True: 133 conn,client_addr=s.accept()#端口監聽中....返回兩個值 ,聯接編號對象 , ip 134 print('獲取到新連接:',client_addr) 135 while True: 136 data=conn.recv(4096)#接收數據 指令 137 print('接收的數據:',data) 138 data= json.loads(data.decode())#反序列 139 if len(data)==0: 140 break 141 if data['action']=='user':#如果是用戶名,進行認證\ 142 serv=socket_server(data,conn) 143 ret=serv.ret_l() 144 if ret['tag']: 145 pass 146 else: 147 continue 148 149 print(data) 150 if data['action']=="put":#如果接收的字典中是put,就是進行接收 151 serv=socket_server(data,conn) 152 serv.put_file(serv.open_f(ret))#調對象方法 153 elif data['action']=='get':#下載 154 serv=socket_server(data,conn)#實例化 155 serv.send_file(serv.open_f(ret))#調 用方法 156 elif data['action']=='ls':#查看 157 serv=socket_server(data,conn) 158 serv.ls_file(serv.open_f(ret)) 159 continue 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: 17 if int((received_size/lens)*100)>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["size"]:#小于接收的文件大小時, 88 recv_data=client.recv(4096) 89 file_obj.write(recv_data)#寫入文件 90 rece_size+=len(recv_data)#增加文件大小計算 91 try: 92 prten.send(len(recv_data)) 93 except StopIteration as e: 94 print('100%') 95 96 else: 97 print("文件[%s]接收完畢!"%data_l["filename"]) 98 file_obj.flush() 99 file_obj.close()#關閉文件 100 elif cmd_list[0]=='ls':#查看目錄文件 101 data_header={ 102 "action":"ls", 103 "filename":'', 104 "size":'' 105 } 106 client.send(json.dumps(data_header).encode())#用json 序列化后,發送相關 信息 107 datas=client.recv(4096)#接收數據 指令 108 data_l= json.loads(datas.decode())#反序列 109 for k,v in enumerate(data_l): 110 print('編號: %s 文件名:%s'%(k,v)) 111 112 else: 113 print(data_d['mag']) 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_s 18 19 20 #進度條 21 def show_process(lens): 22 received_size=0#定義大小 23 current_percent=0#當前大小百分比 24 while received_size<lens: 25 if int((received_size/lens)*100)>current_percent: 26 print('#',end='',flush=True) 27 current_percent=int((received_size/lens)*100) 28 new_size=yield 29 received_size+=new_size View Code

?

轉載于:https://www.cnblogs.com/uge3/p/6993604.html

總結

以上是生活随笔為你收集整理的python第四十一天---作业:简单FTP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 聚色屋| 无码h黄肉3d动漫在线观看 | 少妇xxxx69| 成人av在线看 | 99精品毛片| 国产精品久久久久久久久久久久久久久久久 | 夜夜爱av| 亚洲一区二区三区黄色 | 亚洲黄色三级视频 | 日韩av手机在线免费观看 | 一区二区三区四区国产 | 秋霞网一区二区 | 嫩草网站| 在线免费观看国产精品 | 在线国产欧美 | 九色精品视频 | 青青草激情 | 成年人a级片| 99自拍偷拍视频 | 四虎图库 | 最近免费中文字幕中文高清百度 | 精品国产青草久久久久96 | 亚洲一区精品在线观看 | 黄视频免费在线观看 | 国产15页 | 亚洲国产日本 | 波多野结衣视频免费 | 免费看欧美黄色片 | 日本japanese乳偷乱熟 | 992tv成人免费视频 | 婷婷五月花 | 丰满少妇一区二区三区视频 | 欧美一级淫片免费 | 欧美一区二区三区在线 | 亚洲第一大综合区 | 欧美福利片在线观看 | a黄色一级片 | 一级看片| 国产乱码一区二区三区在线观看 | 色99色| 97成人在线视频 | 精品一区二区三区免费毛片爱 | 综合久久久久 | 中文字幕在线视频不卡 | 动漫毛片| 男同毛片 | 乱人伦xxxx国语对白 | 亚洲最大成人av | 欧美作爱视频 | 日韩欧美三级 | 羞羞动漫免费观看 | 日本美女黄色一级片 | 手机看片欧美日韩 | 免费看黄网站在线观看 | www超碰在线 | 人妻无码一区二区三区久久99 | 91大尺度| 人人舔人人插 | 国产一区二区三区免费看 | 美女视频黄是免费 | 97国产在线视频 | 午夜精品一区二区三区在线播放 | 高清中文字幕mv的电影 | 白嫩初高中害羞小美女 | 二区在线观看 | 精品国产传媒 | 不卡的免费av | 欧美v视频| 青青青青在线 | 欧美黑人精品一区二区 | 国产良妇出轨视频在线观看 | 亚洲综合第一区 | 在线观看污视频网站 | 国产激情av一区二区三区 | 国产嫩草影院久久久 | 女性裸体无遮挡胸 | 爱就操 | 久久亚洲综合 | 国产浮力第一页 | 秘密基地动漫在线观看免费 | 中文幕无线码中文字夫妻 | 蜜臀精品一区二区三区 | 色综合影视 | 丝袜理论片在线观看 | 中文字幕五码 | 久久精品视频在线观看 | 亚洲v在线| 天天干天天舔天天射 | 在线免费一区二区 | 国产精品久久久久久久免费 | 91综合精品 | 欧美一及片| av在线不卡网 | 国产精品免费一区 | 蜜臀在线视频 | 99久久久无码国产 | 女人脱了内裤趴开腿让男躁 | 天天操综合 | 黄色av网站免费看 |