【閑暇一寫】基於TCP協議寫的FTP管理工具

来源:https://www.cnblogs.com/qinyu6/archive/2023/09/28/17736340.html
-Advertisement-
Play Games

這是一個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類的構造函數接收四個參數:currenttargettagcount

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的類。該類是一個用於進度條顯示的類,包括當前進度、目標進度、顯示標記、顯示長度等屬性,以及updatefinishedlistenrun等方法。

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等)。

當命令為quitexit時,退出迴圈並調用__stop方法斷開連接。

__send方法

__send方法用於向FTP伺服器發送消息。在該方法中,通過TCP套接字發送字元串類型的消息。

__recv方法

__recv方法用於接收FTP伺服器返回的消息。在該方法中,使用TCP套接字接收FTP伺服器發送的數據,並將數據轉換為字元串類型。

__download方法

__download方法用於從FTP伺服器下載文件。在該方法中,使用TCP套接字接收FTP伺服器發送的文件數據,並將文件數據寫入本地

__upload方法

__upload方法用於上傳文件到FTP伺服器。在該方法中,使用TCP套接字發送文件數據到FTP伺服器


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 針對改動範圍大、影響面廣的需求,我通常會問上線了最壞情況是什麼?應急預案是什麼?你帶開關了嗎?。當然開關也是有成本的,接下來本篇跟大家一起交流下高頻發佈支撐下的功能開關技術理論與實踐結合的點點滴滴。 ...
  • RPC,Remote Procedure Call 即遠程過程調用,與之相對的是本地服務調用,即LPC(Local Procedure Call)。本地服務調用比較常用,像我們應用內部程式(註意此處是程式而不是方法,程式包含方法)互相調用即為本地過程調用,而遠程過程調用是指在本地調取遠程過程進行使用... ...
  • 使用雙指針進行原地移除元素 題目描述 給定一個數組 nums 和一個值 val,需要將數組中所有等於 val 的元素原地刪除,並返回刪除後數組的新長度。 要求: 不使用額外的數組空間 只能使用 O(1) 額外空間 數組中超過新長度後面的元素可以忽略 示例 1: 輸入:nums = [3,2,2,3] ...
  • 在Python中,字元串可以用單引號或雙引號括起來。'hello' 與 "hello" 是相同的。您可以使用print()函數顯示字元串文字: 示例: print("Hello") print('Hello') 將字元串分配給變數是通過變數名後跟等號和字元串完成的: 示例 a = "Hello" p ...
  • 前言 ThreadLocal可以用來存儲線程的本地數據,做到線程數據的隔離 ThreadLocal的使用不當可能會導致記憶體泄漏,排查記憶體泄漏的問題,不僅需要熟悉JVM、利用好各種分析工具還耗費人工 如果能明白其原理並正確使用,就不會導致各種意外發生 本文將從使用場景、實現原理、記憶體泄漏、設計思想等層 ...
  • 目錄場景1 定義全部異常處理類2 替換request引用3 代碼優化總結 場景 本文前端用的是阿裡的Ant-Design框架,其他框架也有全局攔截器,思路是相同,具體實現自行百度下吧 因為每次都需要調介面,都需要單獨處理異常情況(code !=0),因此前端需要對後端返回的通用響應進行統一處理,比如 ...
  • 在Dart學習的第02天,我們通過基礎語法說明和樣例代碼的方式,學習了Dart的16個基礎語法,這些基礎語法給我們後面編寫的Flutter程式打下來堅實基礎。今天,我們繼續深入學習Dart乃至所有編程語言都非常重要的部分:可迭代的集合…… ...
  • 本篇博文圍繞使用Python開發熱門游戲2048 GAME(命令行版本) 代碼未做任何優化(原生且隨意)、全程以面向過程、MVC的設計思想為主、開發環境是Ubuntu系統下的Pycharm 2048是我很久以前學習Python過程中的一個作業,接下來直入正題—— 一、瞭解游戲 1. 介紹 《2048 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...