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

基于 TCP 协议写的 FTP 管理小工具的更多相关文章

  1. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  2. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

  3. 异常处理、socke基于TCP协议编程

    一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...

  4. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

  5. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  6. 浅析C#基于TCP协议的SCOKET通信

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  7. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  8. (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

    1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...

  9. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  10. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

随机推荐

  1. 基于proxysql实现MySQL读写分离

    前言 环境: 系统版本:CentOS 7 MySQL版本:5.7.35 MySQL主从配置略过. 安装 # 安装 yum localinstall -y ./proxysql-2.2.0-1-cent ...

  2. Jmeter线程组间传递变量

    做接口测试,上一个线程组(A线程组)提取的变量,需要传递给下一个线程组(B线程组)使用.故需要将A线程组内提取的变量设置为全局变量.实现如下: 1. json提取变量(A线程组) 通过json提取器, ...

  3. MindSponge分子动力学模拟——定义一个分子系统(2023.08)

    技术背景 在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用教程.这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSpo ...

  4. GaoNeng:我是如何为OpenTiny贡献新组件的?

    本文共10076字,预计阅读20分钟 大家好啊,又是我GaoNeng.最近在给OpenTiny做贡献,感觉renderless这个架构还是挺有意思的,就贡献了一个color-picker组件,简单写篇 ...

  5. 聊透 GPU 通信技术——GPU Direct、NVLink、RDMA 审核中

    最近人工智能大火,AI 应用所涉及的技术能力包括语音.图像.视频.NLP 等多方面,而这些都需要强大的计算资源支持.AI 技术对算力的需求是非常庞大的,虽然 GPU 的计算能力在持续提升,但是对于 A ...

  6. 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)

    在我们的SqlSugar的开发框架中,整合了Winform端.Vue3+ElementPlus的前端.以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了 ...

  7. Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发

    Dubbo3程序的初步开发 Dubbo3升级的核心内容 易⽤性 开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能 ...

  8. 第五周单元测验题英语教学与互联网 mooc

    第五周单元测验题 返回 本次得分为:16.00/20.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(2分) 从评价的主体来看, ...

  9. Jmeter连接数据库sql语句操作,查询后取值做变量

    第一步 :导入jar包 第二步 :创建JDBC Reques 第三步 :创建JDBC Connection Configuration  第四步:在request中输入数据进行操作 Query Typ ...

  10. jmeter的全局变量(将登陆token设置全局)

    1.首先调用登陆接口,用json提取器,取出响应内的token值  2.在beanshell取样器中设置全局变量 //设置全局变量方法一:用函数__setProperty设置${__setProper ...