這是一個FTP(文件傳輸協議)管理工具,能夠支持文件上傳下載以及操作服務端的文件。 該工具由客戶端和服務端組成。客戶端與服務端通過Socket連接實現通信,客戶端發送命令,服務端解析並執行相應的操作。部分代碼已省略,下麵是服務端和客戶端代碼的詳細解釋。 GitHub:https://github.c ...
這是一個FTP(文件傳輸協議)管理工具,能夠支持文件上傳下載以及操作服務端的文件。
該工具由客戶端和服務端組成。客戶端與服務端通過Socket連接實現通信,客戶端發送命令,服務端解析並執行相應的操作。部分代碼已省略,下麵是服務端和客戶端代碼的詳細解釋。
GitHub:https://github.com/ITchujian/ftp_manager
服務端
以下是服務端代碼中的模塊及其功能:
- import shutil:導入shutil模塊,提供了高級文件操作支持,包括文件複製、刪除、移動等功能。
- import sys:導入sys模塊,提供了一些與Python解釋器及其環境有關的變數和函數。
- import time:導入time模塊,提供了與時間相關的函數。
- from threading import Thread:導入Thread類,提供了線程支持。
- from socket import *:導入所有的socket模塊的函數和變數,包括socket、AF_INET、SOCK_STREAM等。
- import os:導入os模塊,提供了與操作系統交互的函數。
File類的方法:
- ls():返回當前目錄下的所有文件和文件夾。
- format(ls_msg: dict):將ls()方法的返回結果格式化為可讀字元串。
- cd(directory):將當前目錄更改為directory指定的目錄。
- pwd():返回當前目錄路徑。
- mkdir(directory):創建名為directory的文件夾。
- rm(directory):刪除名為directory的文件或文件夾。
Handle類的方法:
- run():處理客戶端的請求,接收並解析客戶端發送的命令,調用File類的相應方法進行處理,將處理結果發送給客戶端。如果客戶端發送了"quit"或"exit"命令,表示客戶端主動斷開連接,方法退出。
接收命令:
- quit 或 exit:斷開連接。
- ls:列出當前目錄下的所有文件和文件夾。
- pwd:返回當前目錄路徑。
- cd:將當前目錄更改為指定目錄。
- mkdir:創建指定的文件夾。
- rm:刪除指定的文件或文件夾。
- dl:下載指定的文件
- up:上傳指定的文件
客戶端
首先是一個基於socket的FTPClient程式中的進度條ProgressBar類。ProgressBar類用於顯示FTP客戶端上傳或下載文件的進度,它可以顯示一個進度條,併在文件傳輸完成時自動退出。
ProgressBar 類的初始化
ProgressBar類的構造函數接收四個參數:current
、target
、tag
和count
。
def __init__(self, current: int, target: int, tag: str = "#", count: int = 100):
self.current = current
self.target = target
self.tag = tag
self.count = count
self.loaded = False
其中,current
表示當前傳輸的數據量(單位為位元組),target
表示總的數據量(單位為位元組),tag
表示進度條的填充字元(預設為“#”),count
表示進度條的長度(預設為100)。
ProgressBar 類的方法
update(value)
update()
方法用於更新進度條的當前值,它接收一個整數參數value
,表示需要更新的數據量(單位為位元組)。
def update(self, value):
self.current += value
finished()
finished()
方法返回一個布爾值,用於判斷文件是否傳輸完成。
def finished(self) -> bool:
if self.loaded:
return self.current >= self.target
return self.loaded
如果進度條已經載入,就判斷當前傳輸的數據量是否大於等於總的數據量;否則返回loaded
屬性的值(預設為False)。
listen()
listen()
方法用於實時顯示進度條,併在文件傳輸完成時自動退出。它使用一個迴圈來監聽數據傳輸的進度,並根據數據的大小更新進度條的顯示。方法內部使用time.sleep()
函數來降低CPU占用率。
def listen(self):
part = self.target // self.count + 1
print("[", end="")
finished = 0
while True:
if finished >= self.count:
break
time.sleep(0.01)
if self.current >= part * (finished + 1):
print("#", end="")
finished += 1
print("]", end="\n")
self.loaded = True
其中,part
表示每個“#”字元代表的數據量大小,finished
表示已經完成的進度條長度。
run()
run()
方法用於啟動listen()
方法,並將其作為一個線程運行。
def run(self):
thread = Thread(target=self.listen)
thread.start()
ProgressBar類用於FTPClient的上傳和下載進度顯示,進度條會根據文件傳輸的進度實時更新,直到文件傳輸完成。
FTPClient類詳解
該代碼是一個FTP客戶端,其主要功能包括與FTP伺服器建立連接、上傳文件、下載文件、創建文件夾、刪除文件等操作。接下來將對代碼中的FTPClient
類進行詳細講解。
ProgressBar類
在FTPClient
類中,有一個名為ProgressBar
的類。該類是一個用於進度條顯示的類,包括當前進度、目標進度、顯示標記、顯示長度等屬性,以及update
、finished
、listen
、run
等方法。
在listen
方法中,使用while True迴圈來更新進度條,並使用time.sleep()
方法來控制更新頻率。在每個迴圈迭代中,根據當前進度和目標進度計算出當前百分比,並根據標記和長度進行輸出。
在run
方法中,使用多線程的方式調用listen
方法,從而實現進度條的實時更新。
FTPClient類
FTPClient
類是整個FTP客戶端的核心類。在類中包含一系列方法,用於與FTP伺服器進行交互。
屬性
FTPClient
類中包含一些屬性:
host
: FTP伺服器的地址port
: FTP伺服器的埠server_addr
: FTP伺服器的地址和埠sock
: 用於與FTP伺服器進行通信的套接字download_file
: 正在下載的文件event
: 用於線程同步的事件
方法
FTPClient
類中包含許多方法,下麵分別進行介紹。
__connect方法
__connect
方法用於連接FTP伺服器。在方法中,使用socket
庫創建一個TCP套接字,並通過該套接字連接FTP伺服器。
__stop方法
__stop
方法用於斷開與FTP伺服器的連接。在方法中,關閉TCP套接字,並使用sys.exit()
方法退出客戶端程式。
run方法
run
方法是整個FTP客戶端的主要方法。在該方法中,首先調用__connect
方法連接FTP伺服器,並使用Event
對象設置事件。
之後,使用迴圈來等待用戶輸入FTP命令。在每次迴圈中,通過TCP套接字發送用戶輸入的FTP命令,並根據不同的命令調用不同的方法(如__download
、__upload
等)。
當命令為quit
或exit
時,退出迴圈並調用__stop
方法斷開連接。
__send方法
__send
方法用於向FTP伺服器發送消息。在該方法中,通過TCP套接字發送字元串類型的消息。
__recv方法
__recv
方法用於接收FTP伺服器返回的消息。在該方法中,使用TCP套接字接收FTP伺服器發送的數據,並將數據轉換為字元串類型。
__download方法
__download
方法用於從FTP伺服器下載文件。在該方法中,使用TCP套接字接收FTP伺服器發送的文件數據,並將文件數據寫入本地
__upload方法
__upload
方法用於上傳文件到FTP伺服器。在該方法中,使用TCP套接字發送文件數據到FTP伺服器