基于Qt的FTP客户端的实现
2022-09-09党宇超孙文俊孔强
党宇超 孙文俊 孔强
(杭州应用声学研究所 浙江省杭州市 310000)
FTP 协议是用于文件交互的协议,该协议以明文的方式进行传输,在公共网络会面临极大风险。但是对于自成体系的局域网系统来说,在不考虑恶意破坏的情况下,采用FTP可以方便地满足系统内部绝大多数的文件交互需要。
FTP 服务为C/S 架构,FTP 服务端本身提供了文件传输、命令交互、用户管理、日志记录、目录限制等功能。如果基于服务端使用这些功能,需要基于服务端的配置文件。但是在某些场景下,变动服务器的配置文件不太方便甚至不可能。如果基于FTP 客户端实现这些功能,就可以在不变动服务端配置的情况下达到目标。如今市面上已经有很多成熟的FTP 客户端软件,但无法满足特定的用户管理、日志记录、远程备份等功能,同时还存在一些不方便使用的地方。
本文主要介绍了如何基于QT 实现上述功能的FTP 客户端软件,同时介绍了实现时需要注意的问题。
1 软件架构
本软件面向两类用户,分别是管理员和普通用户。软件基于管理员对软件的配置运行。管理员配置好各用户的登陆信息、访问权限、操作限制,普通用户只能基于管理员的设置和给定的用户登录信息登陆软件并使用。管理员的登陆权限需要由超级管理员发放。超级管理员根据管理员提供的MAC 地址生成管理员的密码以供其登陆。在这种模式下,软件的权限层次分为三级,超级管理员控制软件管理权限的分发,普通管理员控制普通用户的用户信息及其操作权限、可访问目录等。
本软件主要分为三个功能模块:本地文件编辑模块、文件传输模块、用户管理模块。本地编辑模块包括本地文件夹创建、本地文件(夹)删除、本地文件(夹)重命名、本地文件(夹)比对。文件传输模块包括文件上传、文件下载、一键上传(多地址上传)。用户管理模块负责用户信息、权限的增删改查和控制。如图1 所示。
图1 :FTP 客户端软件架构
2 软件实现
Qt 是一个跨平台的基于多种编程语言图形界面框架,能较好地支持界面设计,封装了网络编程、多线程、数据库连接等基础功能,具有良好的跨平台性,有通用的成熟的应用插件,也可以方便地创建自定义插件。软件使用QtCreator工具开发。QtCreator 是一款轻量级集成开发环境,具有高级的代码编辑器、项目生成和部署工具、性能分析工具以及大量的样例工程。
Ftp 客户端在本地进行用户管理、权限控制需要基于本地文件或配置信息进行管理,所以,需要考虑恰当的文件加密,并辅助以其他措施来禁止人为对这些文件的更改或破坏。通过考察目前最广泛流行的Ftp 客户端软件,可以吸收其设计上的优越之处,同时在实现时,要充分考虑到本地化的特征和使用需要。具体来说,软件在实现时需要着重考虑以下若干问题。
2.1 软件控制
Ftp 连接是不具有保密性质的连接形式,所以,基于Ftp连接的保密和控制只能做到一般意义上的简单控制,不可能完全做到保密。因此,本软件也只是适用于不需要考虑恶意破坏的内部使用场景。
基于客户端控制的Ftp 软件运行时,需要打开配置文件、用户信息文件、日志文件。其中,配置文件和用户信息文件需要进行加密。如果不对这类文件进行加密,则用户可以轻易地获取软件的配置和用户信息,软件的权限控制就失去意义。软件加密通过Base64 编码进行编码转换,然后基于固定字符串和加密时的时间对编码“加盐”,“加盐”后再进行一次Base64 编码转换。这种加密方式较为简易,具有一般的安全保密机制。
为了保护软件正常使用,本软件集成了配置文件检测机制。如果配置文件、登陆信息文件或日志文件不存在或者遭到修改,软件要么无法打开,要么会在使用中强制退出且无法再次打开,以此来禁止用户对于敏感文件的恶意操作。其中,配置信息文件、登陆信息文件会在文件开头保存有最近一次由软件读取该文件所生成的识别序列字符串。如果该字符串或者信息文件主体内容被修改,软件都被判定该信息文件失效,进而控制软件退出。
2.2 本地文件编辑
本地文件编辑包含常见的本地文件编辑功能:创建文件夹、删除文件(夹)、重命名文件(夹)、打开文件(夹)。同时,集成了文件(夹)比对功能。
在比对单个文件时,软件会从文件名、文件路径、文件大小、最后修改日期、文件内容角度对文件进行比对。其中,文件内容比对是指以二进制流读取文件后,根据文件内容生成一个哈希值,通过对比文件的哈希值以此来确定文件是否在内容上完全一致。从单文件比对扩展开来,软件可以进行本地文件夹比对、远程与本地文件(夹)比对。其中,远程与本地文件(夹)比对是由软件自动下载远程文件(夹)内容,然后基于本地文件(夹)比对逻辑进行比对,比对结束后软件自动删除临时下载的远程文件。
2.3 文件传输
FTP 的传输使用到两个端口,一个端口负责控制流,一个端口负责数据流。部分开源的FTP 客户端工具选择用单个连接去进行控制,这样就可能带来一个操作问题,即在文件进行传输过程中,而刷新远程目录等控制命令难以收到回复,需要等待两次传输任务的间隙才能进行控制。还有部分的工具会直接在用户界面主线程中进行文件传输,不构建传输队列,不易于进行异步式操作,只能等待当前任务结束。本软件单独使用一个连接用于检测服务端状态、命令控制、远程目录刷新、远程非文件传输任务的执行,另外若干连接用于文件任务传输。
以上传来说,本软件有两种连接传输方式。一种为“单地址连接”,一种为“一键上传”。其中,“单地址连接”与一般的FTP 客户端含义相同,即与某一FTP 服务端建立连接后,进行上传或者下载文件。文件上传的逻辑流程如图2 所示。在上传的过程,软件会根据管理员的设置信息,判定是否需要建立用于存放备份文件、日志文件的远程文件夹,以及在上传文件前是否需要备份远程文件,上传文件后是否需要上传日志。日志和备份文件的接口对普通用户关闭,需要管理员为其开启相应的权限才能访问。
图2 :文件上传流程
“一键上传”的含义为:用户指定提前设定好的若干个需要连接的地址和上传的文件后,软件自动与各个指定的地址建立连接并上传指定的文件。选定本地需要上传的文件夹后,点击“一键上传”按钮会显示出一个用于确认上传信息的对话框。软件会对当前用户所有可以建立连接的目标地址进行网络连接性测试,在测试结束后,对话框会显示出各个目标地址的可连接情况。用户指定好需要上传的目标地址,确认好需要上传的服务器目标文件夹后,点击“确认”就可以上传文件。
在设置好需要上传的本地文件(夹)或需要下载(比对)的远程文件(夹)后,软件会建立好传输队列,在传输过程中即时更新传输进度、状态变更、本地日志。在传输结束后,会适时上传日志信息,根据不同任务清空临时文件或信息。在进行上传的任务中,最常见的问题就是网络故障。当出现网络问题时,应该对队列中后续的相同目标地址的任务进行处理,避免进行无效的尝试。在失败任务队列中,本软件提供了恢复失败任务的功能,即在经过测试可以正常连接后,一键恢复由于连接中断导致失败的任务。
2.4 连接池管理
对于“一键上传”这种需要将文件上传至多个地址的任务来说,本软件利用连接池来加快上传速度,减少资源闲置。
需要注意的是,Qt4 版本中的QFtp 连接类存在偶发的下载完成后无法返回任务完成信号的Bug。所以,在Qt4 版本下,可以利用QFtp 等连接类进行上传任务,利用其他的连接类或自定义连接类进行其他任务,即在连接池中构建多种类型的连接以适应不同的任务。Qt5 版本下,官方版本已经去除了QFtp 这一连接类,在开源仓库中存在非官方的适用于Qt5 的第三方库,不过,其效率和稳定性未被充分验证。
在构建连接池时,有一些问题需要注意:连接池中的连接需要避免反复地连接,否则容易造成服务器拒绝服务。具体来说,在构建上传任务序列时,需要对上传任务进行排序和规整,避免连接在不同地址间高频来回切换,即对于地址相同的任务来说,要使用连接池中已经连接到该地址的连接。要避免多个连接同时连接至相同的地址,否则,只会弱化该地址上各个连接的上传速度,不会带来效率上的提升。在将本地某一文件上传到多个目标服务端时,在打开本地文件后,需要控制好文件的状态,避免文件被不合适地关闭导致任务上传的失败。
2.5 用户管理
本软件采用基于本地文件的登陆方式,登陆所用的本地文件经过软件加密。用户信息、设置信息只能在成功登陆软件后由软件进行解密后才能展示。
用户在使用软件前必须先登录,依自己的权限使用软件。用于管理用户帐号和可访问目录的“用户管理”页面只有管理员才能看到,普通用户无法访问。以管理员身份登陆到系统后,管理员可以访问和编辑普通用户的可访问目录。其中可访问目录的格式为“目标地址1={远程目录1,远程目录2}&目标地址2...”,含义为:指定用户登录系统后,只能访问可访问目录里指定的目标地址和目标地址下指定的若干个目录(包含该目录下的目录)。
管理员的权限由超级管理员发放,管理员的软件登录密码与安装软件的计算机的MAC 地址绑定。即超级管理员通过软件的管理员密码生成功能,根据管理员所用计算机的MAC 地址,生成一串密码交由管理员用于登录软件。在这种方式下,软件的管理员权限被限定于特定的计算机,以此来控制管理员的权限不扩散。
2.6 字符编码控制
部分Ftp 客户端软件在进行Ftp 交互时,未充分考虑到中文使用环境,所以,在命令交互时,未进行编码转换。如此会导致上传本地带中文字符的文件或文件夹到远程目录后,远程的对应文件(夹)出现乱码,且文件(夹)由于乱码无法进行远程重命名、修改或删除等操作,文件(夹)难以从服务器清除。因此,在进行命令交互时,需要注意将编码变换为统一的编码后进行Ftp 的命令交互。以上传举例来说,在本地构建好上传队列后,在执行上传命令之前,需要将队列中的本地路径全部进行编码转换,然后以转换后的路径与服务端进行上传交互。类似的,在获取到远程目录时,需要以上传时编码的逆向操作来其进行编解码,再对结果进行处理。
3 应用
本软件界面设计如图3 所示,界面主体由上方的工具栏,中部本地、远程文件树,以及下方的传输队列及状态展示组成。软件去除了很多Ftp 客户端中控制台的信息,将控制台对应的命令交互日志信息保存于后台日志文件中。对于普通用户来说,这些信息的意义不大,具体的错误信息可以通过错误提示的形式反馈给用户。以管理员身份登录软件并连接某一服务端后,可以看到本地及远程文件树。在此状态下,用户可以进行上传、下载、远程刷新、远程删除、本地(远程)文件对比等操作。
图3 :文件上传图示
如图4 所示,以测试身份登录软件。可以看到软件上方的用户管理界面已经不对其开放了。选取好本地文件,点击“一键上传”,可以看到基于配置文件的若干连接地址。软件首先会对用户指定的地址进行可连接性测试,测试结束后,地址状态会被更新。其中,状态为绿色的表示可以建立连接,状态为红色的表示无法建立连接。用户确认需要上传的地址后,就可以上传本地文件到选取的可以建立连接的若干地址的特定远程目录下。
图4 :一键上传图示
需要注意的时,在“单地址连接”时,每上传一个文件(夹)结束,需要刷新远程目录树以给用户上传结果的反馈。但是,在“一键上传”模式下,由于存在多个远程目录树,如果也以如此方式进行刷新,会导致界面高频切换和刷新,且用户无法进行操作。因此,在这种模式下,应该禁止单地址连接及远程文件树的显示和操作。用户可以通过下方的任务进行列表查看任务进行情况。
如图5 所示,登陆软件后,分别添加本地两个文件夹到文件夹对比后,软件会依次读取两文件夹内的文件并计算哈希值,最后将重要文件信息罗列出来,排序并进行比较。文件列表会被按名称进行排序,其中,文件名称、大小、内容全部一致的会被标为绿色。在进行文件夹比对时,需要通过异步的方式来处理任务。即建立后台线程去依次读取文件,不宜将处理过程放在主界面线程中。
图5 :本地文件夹比对
4 总结
本文介绍的软件为一款基于Qt 框架的Ftp 客户端软件,除了拥有一般Ftp 客户端软件基础的本地编辑和文件访问功能外,还结合特定场景使用需求,集成了基于客户端的权限控制、日志记录、文件备份、一键上传等功能。软件对多个模块的若干使用细节进行了优化处理,提升了对主体任务传输处理的速度。