热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

明明白白用Qt5.10编写FTP客户端

使用Linux自带工具实现定时下载FTP文件(文末)前言自从Qt5删除了QFtp模块后,就没有了可方便使用的FTP类。根据官方的说法&#
  • 使用Linux自带工具实现定时下载FTP文件(文末)



前言

自从Qt5删除了QFtp模块后,就没有了可方便使用的FTP类。根据官方的说法,是因为该模块实现质量不好被删除,而用Qt5的网络模块就可以轻松实现。对于初学者没了现成的工具就不知道该咋办了。本文从FTP协议开始讲起,先明白FTP协议是一个怎样的结构。然后讲解如何用代码去实现。

全文分两大部分,第一部分是FTP协议的讲解,第二部分是Qt5的代码实现。笔者会尽量用简洁明了的语句给列为讲清楚的,让我们开始吧~~


  1. FTP协议
  2. Qt5的代码实现



第一部分 FTP协议

什么是FTP协议?

就是传文件用的协议。整个过程就是先用TCP与服务器建立连接,然后发送命令,服务器执行并进行反馈。

FTP的两个端口

一般的客户端/服务器之间是开一个Socket端口,既传输命令又传输数据。而FTP的协议中说:我要开两个端口,一个传输命令,一个传输数据。


  • 传输命令端口(21)
  • 传输数据端口(20)

所以在编程的时候要创建两个QTcpSocket哦~

FTP的两种过程

分为被动模式和主动模式。这是从客户端的角度来说的。比如常见的被动模式意思就是服务器告诉你我们用哪个端口进行数据传输,我们(客户端)没有指定端口的权力,它(服务器)说用啥端口我们(客户端)就用啥端口。

而主动模式就是我们(客户端)自己定好用哪个端口,告诉了服务器,然后双方在这个端口下进行通信。


  • 被动模式(常用)

根据上文所述,既然都“被动”了,那我们客户端就等着服务器给我们分配端口号吧。

(1)首先我们任意打开一个端口N连接FTP服务器,并在Socket中写“PASV”命令。这里的N必须大于1024;

(2)然后服务器会返回个信息,类似“227 Entering Passive Mode(47,94,99,120,39,18)”这样。前四个是服务器IP地址,后两个是和分配的端口号相关的数。从这条信息我们就知道了服务器给我们分配的用于数据传输的端口号是:39*256+18;

(3)然后我们就打开第二个端口N+1和服务器的这个39*256+18端口进行连接,然后数据传输。


  • 主动模式

根据上文所述,既然都“主动”了,那我们客户端就自由分配进行数据传输的端口号吧。

(1)第一步还是任意打开两个端口N和N+1,先用N端口连接FTP服务器的21端口,同时第二个端口N+1进行监听。在第一个端口发送“port N+1”命令;

(2)这时服务器就会主动连接到我们的N+1端口上了。

FTP命令及响应码

FTP命令


命令字符串结尾要加'\n'

  • ABOR:中断数据连接程序
  • ACCT :系统特权帐号
  • ALLO :为服务器上的文件存储器分配字节
  • APPE :添加文件到服务器同名文件
  • CDUP :改变服务器上的父目录
  • CWD :改变服务器上的工作目录
  • DELE :删除服务器上的指定文件
  • HELP :返回指定命令信息
  • LIST :如果是文件名列出文件信息,如果是目录则列出文件列表
  • MODE :传输模式(S=流模式,B=块模式,C=压缩模式)
  • MKD :在服务器上建立指定目录
  • NLST :列出指定目录内容
  • NOOP:无动作,除了来自服务器上的承认
  • PASS

    :系统登录密码

  • PASV:请求服务器等待数据连接
  • PORT
    :IP 地址和两字节的端口 ID
  • PWD:显示当前工作目录
  • QUIT:从 FTP 服务器上退出登录
  • REIN:重新初始化登录状态连接
  • REST :由特定偏移量重启文件传递
  • RETR :从服务器上找回(复制)文件
  • RMD :在服务器上删除指定目录
  • RNFR :对旧路径重命名
  • RNTO :对新路径重命名
  • SITE

    :由服务器提供的站点特殊参数

  • SMNT

    :挂载指定文件结构

  • STAT :在当前程序或目录上返回信息
  • STOR :储存(复制)文件到服务器上
  • STOU :储存文件到服务器名称上
  • STRU :数据结构(F=文件,R=记录,P=页面)
  • SYST:返回服务器使用的操作系统
  • TYPE :数据类型(A=ASCII,E=EBCDIC,I=binary)
  • USER :系统登录的用户名

FTP响应码


  • 110:新文件指示器上的重启标记
  • 120:服务器准备就绪的时间(分钟数)
  • 125:打开数据连接,开始传输
  • 150:打开连接
  • 200:成功
  • 202:命令没有执行
  • 211:系统状态回复
  • 212:目录状态回复
  • 213:文件状态回复
  • 214:帮助信息回复
  • 215:系统类型回复
  • 220:服务就绪
  • 221:退出网络
  • 225:打开数据连接
  • 226:结束数据连接
  • 227:进入被动模式(IP 地址、ID 端口)
  • 230:登录因特网
  • 250:文件行为完成
  • 257:路径名建立
  • 331:要求密码
  • 332:要求帐号
  • 350:文件行为暂停
  • 421:服务关闭
  • 425:无法打开数据连接
  • 426:结束连接
  • 450:文件不可用
  • 451:遇到本地错误
  • 452:磁盘空间不足
  • 500:无效命令
  • 501:错误参数
  • 502:命令没有执行
  • 503:错误指令序列
  • 504:无效命令参数
  • 530:未登录网络
  • 532:存储文件需要帐号
  • 550:文件不可用
  • 551:不知道的页类型
  • 552:超过存储分配
  • 553:文件名不允许



第二部分 FTP的Qt5的代码实现


网络编程三步骤:Socket连接、Write/Read读写、Close关闭

  • 被动模式的代码实现

一般的服务器都是采用被动模式,所以先讲解这部分。

主界面

1/3 Socket连接

/* 构造Socket,并连接 */
socket = new QTcpSocket(this);
connect(socket,&QTcpSocket::connected,this,&MainWindow::slotConnected);
connect(socket,&QTcpSocket::readyRead,this,&MainWindow::dataReceived);
socket->connectToHost("47.94.99.120",21);

有两个槽,slotConnected()槽的作用是如果Socket和服务器建立连接,就在textEdit上显示“已建立Socket连接”的字样;dataeceived()槽的作用是显示服务器反馈回来的信息。


  • void slotConnected()槽

void MainWindow::slotConnected()
{ui->textEdit->append("已建立Socket连接");
}

  • void dataReceived()槽

void MainWindow::dataReceived()
{while (socket->bytesAvailable()){/* 读取Socket并存入datagram */QByteArray datagram = socket->readAll();/* 展示在textEdit */QString str = QString::fromLocal8Bit(datagram);ui->textEdit->append(str);}
}

看下效果:

通过连接,服务器反馈回“220 (vsFTPd 3.0.2)”的信息。由上文所述,220响应码的含义是“服务就绪”。那么接下来就是write/read过程了。

2/3 Write/Read读写

“发送命令”按钮的代码:

void MainWindow::on_pbSend_clicked()
{QByteArray command = ui->lineEdit->text().toLatin1();command += '\n';socket->write(command);
}

注意:命令结尾不要忘了加个'\n'回车符号。

发送 USER user_name 用户名

发送 PASS xxxxxxx 密码

发送 PASV 命令

到此为止,服务器给我们回复“227 Entering Passive Mode(47,94,99,120,39,16)”的响应码,这是要告诉我们“应该采用被动模式”,后面还附带了服务器IP地址,以及两个变量。通过计算得知,服务器给我们分配的数据传输端口号是:39*256+16=10000。

接下来就是再构造一个Socket,端口号为10000,去连接服务器的20端口号(传输数据用)。然后各种命令,接受的文件也用Socket的read()等函数去接受,然后QFile各种存文件操作等等等等。



接下来的步骤就不写了,FTP协议属于应用层的部分,具体如何按照这个标准去组织语言就是列位发挥的部分了。

刚开始我写FTP协议的时候摸不着头脑,也不懂HTTP协议、FTP协议等内容,后来经过摸索才知道:哦,这就是应用层的东西。人家都已经告诉你如何去实现FTP的过程了,我们就照着这个过程写程序就是咯。

所以整个过程还是很简单的,就是用Socket去你来我往的交流而已,没有涉及多么高大上的东西。FTP协议很简单吧~




使用Linux自带工具实现定时下载FTP文件(4月8日新增)

总共分两步骤:编写下载脚本、添加定时任务。

编写下载脚本

#!/bin/bashftp -n <open xxx.xxx.xxx.xxx #FTP服务器地址
user username password #用户名、密码
binary
lcd /home/psx/data #设置文件保存位置
prompt
mget *
close
byeEOF

其中,prompt意思是关闭交互。

添加定时任务(每分钟执行一次)

打开终端输入:

crontab -e

编写内容:

*/1 * * * * /bin/bash /home/psx/download_ftp

download_ftp是我自己写的脚本,你改成自己的脚本路径。*号和空格不能少。然后按ESC,按shift+:,输入wq保存退出即可立即生效。

关于crontab参数含义可以网上搜索下看看,非常简单。


推荐阅读
  • linux 命令——screen
    最近遇到一个东西aria2,这个玩意,这个是啥呢?Aria2是一个轻量级Linux下载软件,支持HTTPHTTPS,FTP,SFTP,BitTorrent和磁力链接(官方版),公司 ... [详细]
  • IP双栈环境下网络应用迁移
    IPv4向IPv6迁移有多种途径,在选择具体的迁移方式时,当前环境中运行的应用是否支持IPv6是重要的考量因素之一,同时在编写新的应用时,需要考虑新编写的应用不仅可以适应当前主流的IPv4环境, ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • SVN 功能说明(简版)
    Subversion(SVN)是什么?SVN是一种版本管理系统,是开源软件的基石。即使在沟通充分的情况下,多人维护同一份源代码的一定也会 ... [详细]
  • Azkaban(三)Azkaban的使用
    界面介绍首页有四个菜单projects:最重要的部分,创建一个工程,所有flows将在工程中运行。scheduling:显示定时任务executing:显示当前运行的任务histo ... [详细]
  • FILETYPE*filetype.txt*ForVimversion6.4.文件类型*filetype**file-type*1.文件类型|filetypes|2.文件类型插 ... [详细]
  • 用lvm+vmware+kickstart实现系统自动安装和快照安装
    由于我的机子是32位,装不了64位系统,所以无法使用kvm,只能用vmware了,可是vmware安装使用自带的autoinst.iso实现自动安装,无法实现我的需求,经过研究我使用kic ... [详细]
  • PHP程序员玩转Linux系列 搭建FTP代码开发环境
    PHP程序员玩转Linux系列搭建FTP代码开发环境-PHP程序员玩转Linux系列文章:有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的是让大家 ... [详细]
  • linux ftp 线程数设置,Linux搭建ftp在windows下这么访问,需要怎么设置【设置vsftp最大连接数和每个ip的最大连接数】...
    文章来源:http:zhidao.baidu.comlink?urlLOfStD1kcxGhI_D5qC7oka3_4QZc1nn1SJwWaSd4onWoVl5Wt ... [详细]
  • 阿里云如何部署php(2023年最新分享)
    导读:很多朋友问到关于阿里云如何部署php的相关问题,本文编程笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!本文目录一览: ... [详细]
  • linux搭建FTP
    linux下FTP的搭建及优化[日期:2007-11-04]李磊19840817吴康[字体:大中小]首先安装Linux企业版第一张光盘中的vsftpd- ... [详细]
author-avatar
mobiledu2502922617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有