【閑暇一寫】基於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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...