首页 > 其他分享 >【闲暇一写】基于TCP协议写的FTP管理工具

【闲暇一写】基于TCP协议写的FTP管理工具

时间:2023-09-28 18:55:56浏览次数:36  
标签:__ FTP 进度条 self 管理工具 TCP 方法 客户端

这是一个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服务器

标签:__,FTP,进度条,self,管理工具,TCP,方法,客户端
From: https://www.cnblogs.com/qinyu6/p/17736340.html

相关文章

  • 敏捷开发和传统开发有什么区别?以及Scrum管理工具的推荐
    ​敏捷开发和传统开发的区别主要体现在以下几个方面:团队建设不同:敏捷开发以团队为单位,强调团队建设,赋予高度的责任,支持开发、透明的交流环境;传统开发以个人为单位,团队成员之间交付很少。管理流程不同:敏捷开发流程可以简单,但规划与执行必须严谨;传统开发流程复杂,繁琐,静态,变更成本......
  • 1.go安装和包管理工具
    下载地址安装之后,自动添加系统环境变量PATH=>"C:\Go\bin"查看go版本信息goenv使用七牛云设置golang环境,代理goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cn,direct保管理工具go1.11之后,使用goMod管理go初始化gomodeinitnameuser......
  • 热门敏捷项目管理工具(收藏)
    ​敏捷管理研发工具可以协助团队更好地进行敏捷开发和管理。以下是几种流行的敏捷管理研发工具:Leangoo:Leangoo领歌一款永久免费的专业敏捷研发管理工具,它覆盖了敏捷项目研发全流程,包括小型团队敏捷开发,规模化敏捷SAFe,ScrumofScrums大规模敏捷。Tuleap:Tuleap是一款免费开源项......
  • 包管理工具-yarn的特别礼物
    yarn的特别礼物在终端命令上,yarn不仅仅是对npm的命令做了一个改名,还增加了一些原本没有的命令,这些命令在某些时候使用起来非常方便yarncheck使用yarncheck命令,可以验证package.json文件的依赖记录和lock文件是否一致这对于防止篡改非常有用yarnaudit使用yarnaudit......
  • 包管理工具 - yarn 的核心命令
    yarn的核心命令初始化初始化:yarninit[--yes/-y]安装添加指定包:yarn[global]addpackage-name[--dev/-D][--exact/-E]安装package.json中的所有依赖:yarninstall[--production/--prod]脚本和本地CLI运行脚本:yarnrun脚本名start、stop、test可以省略run......
  • 包管理工具-Yarn
    yarn简介yarn官网:https://www.yarnpkg.com/zh-Hans/yarn是由Facebook、Google、Exponent和Tilde联合推出了一个新的JS包管理工具,它仍然使用npm的registry,不过提供了全新CLI来对包进行管理过去,yarn的出现极大的抢夺了npm的市场,甚至有人戏言,npm只剩下一个regi......
  • TCP/IP
    TCP/IP是因特网的通信协议。TCP/IP通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。计算机通信协议(ComputerCommunicationProtocol)计算机通信协议是对那些计算机必须遵守以便彼此通信的的规则的描述。什么是TCP/IP?TCP/IP是供已连接因特网的......
  • zsh的错误配置导致sftp无法正常使用
    先上图。有段时间一直用MobaTerm之类的终端连接ssh都正常,但sftp一直练不上。起初只是以为是软件的原因,后来今天用filezilla上传数据发现sftp会报超时(报错如上。折腾了半天才发现是.bashrc文件里的一行zsh引起的,把他注释掉之后就一切正常了。下面是.bashrc的对应配置#starship......
  • tcpdump 抓包命令的使用
     ##抓取192.168.6.6的tcpdump -i 网卡  host 192.168.6.6  ##抓取目的端口为22的网络数据tcpdump -i 网卡  dst port 22##抓取udp协议的tcpdump -i网卡 udp 过滤协议 ##抓包存取tcpdump -i eth0 host 192.168.66.6 andport......
  • Linux下的网络抓包tcpdump
    tcpdump[-AdDefIJKlLnNOpqRStuUvxX][-Bbuffer_size][-ccount][-Cfile_size][-Grotate_seconds][-Ffile][-iinterface][-jtstamp_type][-mmodule][-Msecret][-Q|-Pin|out|inout][-rfile][-ssnaplen][-Ttype][-wfile......