第33篇 网络(三)FTP(一)

news2024/11/25 4:22:49

导语

上一节我们讲述了HTTP的编程,这一节讲述与其及其相似的FTP的编程。FTP即FileTransfer Protocol,也就是文件传输协议。FTP的主要作用,就是让用户连接上一个远程计算机,查看远程计算机有哪些文件,然后把文件从远程计算机上拷贝到本地计算机,或者把本地计算机的文件送到远程计算机上。

环境:Windows Xp + Qt 4.8.5+QtCreator 2.8.0

目录

  • 一、简介
  • 二、实现简单的文件下载

正文

一、简介

在Qt中,我们可以使用上一节讲述的QNetworkAccessManagerQNetworkReply类来进行FTP 程序的编写,因为它们用起来很简单。但是,对于较复杂的FTP操作,Qt还提供了QFtp类,利用这个类,我们很容易写出一个FTP客户端程序。下面我们先在帮助中查看这个类。

在QFtp中,所有的操作都对应一个特定的函数,我们可以称它们为命令。如connectToHost()连接到服务器命令,login()登录命令,get()下载命令,mkdir()新建目录命令等。因为QFtp类以异步方式工作,所以所有的这些函数都不是阻塞函数。也就是说,如果一个操作不能立即执行,那么这个函数就会直接返回,直到程序控制权返回Qt事件循环后才真正执行,它们不会影响界面的显示。

所有的命令都返回一个int 型的编号,使用这个编号让我们可以跟踪这个命令,查看其执行状态。当每条命令开始执行时,都会发出commandStarted()信号,当该命令执行结束时,会发出commandFinished()信号。我们可以利用这两个信号和命令的编号来获取命令的执行状态。当然,如果不想执行每条命令都要记下它的编号,也可以使用currentCommand()来获取现在执行的命令,其返回值与命令的对应关系如下图。

二、实现简单的文件下载

下面我们先看一个简单的FTP客户端的例子,然后对它进行扩展。在这个例子中我们从FTP服务器上下载一个文件并显示出来。

1.我们新建Qt Gui应用。 项目名次为myFtp,基类选择QWidget,类名保持Widget即可。完成后打开muFtp.pro文件,在上面添加一行:QT += network,然后保存该文件。

2.修改widget.ui文件。 在其中添加一个TextBrowser 和一个 Label,效果如下。

3.在main.cpp中进行修改。

为了在程序中可以使用中文,我们在main.cpp中添加头文件#include <QTextCodec>

并在main()函数中添加代码:

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

4.在widget.h中进行修改。

先添加头文件:#include <QFtp>

再在private中定义对象:QFtp *ftp;

添加私有槽函数:

private slots:
    void ftpCommandStarted(int);
void ftpCommandFinished(int,bool);

5.在widget.cpp中进行更改。

(1)在构造函数中添加代码:

ftp = new QFtp(this);
ftp->connectToHost("ftp.qt-project.org"); //连接到服务器
ftp->login();   //登录
ftp->cd("qt/source");   //跳转到“qt”目录下的source目录中
ftp->get("INSTALL");  //下载“INSTALL”文件
ftp->close();   //关闭连接

// 当每条命令开始执行时发出相应的信号
connect(ftp,SIGNAL(commandStarted(int)),
        this,SLOT(ftpCommandStarted(int)));

// 当每条命令执行结束时发出相应的信号
connect(ftp,SIGNAL(commandFinished(int,bool)),
        this,SLOT(ftpCommandFinished(int,bool)));

我们在构造函数里执行了几个FTP的操作,登录站点,并下载了一个文件。然后又关联了两个信号和槽,用来跟踪命令的执行情况。

(2)实现槽函数:

void Widget::ftpCommandStarted(int)
{
    if(ftp->currentCommand() == QFtp::ConnectToHost){
       ui->label->setText(tr("正在连接到服务器..."));
    }
    if (ftp->currentCommand() == QFtp::Login){
       ui->label->setText(tr("正在登录..."));
    }
    if (ftp->currentCommand() == QFtp::Get){
       ui->label->setText(tr("正在下载..."));
    }
    else if (ftp->currentCommand() == QFtp::Close){
       ui->label->setText(tr("正在关闭连接..."));
    }
}

每当命令执行时,都会执行ftpCommandStarted()函数,它有一个参数int id,这个id就是调用命令时返回的id,如int loginID= ftp->login();这时,我们就可以用if(id == loginID)来判断执行的是否是login()函数。但是,我们不想为每个命令都设置一个变量来存储其返回值,所以,我们这里使用了ftp->currentCommand(),它也能获取当前执行的命令的类型。在这个函数里我们让开始不同的命令时显示不同的状态信息。

void Widget::ftpCommandFinished(int,bool error)
{
    if(ftp->currentCommand() == QFtp::ConnectToHost){
       if(error)
           ui->label->setText(tr("连接服务器出现错误:%1")
                               .arg(ftp->errorString()));
       else ui->label->setText(tr("连接到服务器成功"));
    }
    if (ftp->currentCommand() == QFtp::Login){
       if(error)
           ui->label->setText(tr("登录出现错误:%1")
                               .arg(ftp->errorString()));
       else ui->label->setText(tr("登录成功"));
    }
    if (ftp->currentCommand() == QFtp::Get){
       if(error)
           ui->label->setText(tr("下载出现错误:%1")
                               .arg(ftp->errorString()));
       else {
           ui->label->setText(tr("已经完成下载"));
           ui->textBrowser->setText(ftp->readAll());
       }
    }
    else if (ftp->currentCommand() == QFtp::Close){
       ui->label->setText(tr("已经关闭连接"));
    }
}

这个函数与ftpCommandStarted()函数相似,但是,它是在一个命令执行结束时执行的。它有两个参数,第一个intid,就是调用命令时返回的编号,我们在上面已经讲过了。第二个是bool error,它标志现在执行的命令是否出现了错误。如果出现了错误,那么errortrue ,否则为false。我们可以利用它来输出错误信息。在这个函数中,我们在完成一条命令时显示不同的状态信息,并显示可能的出错信息。在if (ftp->currentCommand() == QFtp::Get)中,也就是已经完成下载时,我们让textBrowser显示下载的信息。

6.运行程序,效果如下。

7.出错演示。

下面我们演示一下出错时的情况。

将构造函数中的代码ftp->login();改为ftp->login("tom","123456");

这时我们再运行程序:

可以看到,它输出了错误信息,指明了错误的指令和出错的内容。其实我们设置的这个错误,也是想告诉大家,在FTP中如果没有设置用户名和密码,那么默认的用户名应该是anonymous,这时密码可以任意填写,而使用其他用户名是会出错的。

结语

在下一节中,我们将会对这个程序进行扩展,让它可以浏览服务器上的所有文件,并进行下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F4 | STM32CubeMX 图形配置工具

文章目录一、STM32CubeMX 简介二、STM32CubeMX 运行环境搭建1.Java环境安装2.STM32CubeMX 图形化工具安装三、使用 STM32CubeMX 工具配置工程模板1.工程初步建立和保存2.RCC 设置3.时钟系统&#xff08;时钟树&#xff09;配置4.GPIO 功能引脚配置5.生成工程源码6.编写用户程序…

汽车行业:充分借力数据价值,推动数字化营销链路闭环

当下&#xff0c;汽车行业已慢慢由曾经的增量市场逐步转变为存量市场。更年轻的消费群体偏好、更精准智能的营销投放策略和强势入局的新能源汽车等因素都在推动着汽车行业的不断发展。对于汽车厂商和垂域媒体来说&#xff0c;进行丰富的人群洞察与用户分层&#xff0c;能挖掘更…

陪诊服务系统源码,可以在线预约陪诊师的软件平台

随着生活方式受互联网的影响&#xff0c;我们的各方面都变得更加便利&#xff0c;也伴随着我国人口老龄化&#xff0c;大部分年轻人都选择了外出打工&#xff0c;背井离乡&#xff0c;从而没有办法待在父母身边照顾&#xff0c;陪诊师就是在这个大背景下诞生了&#xff0c;陪诊…

班级校园网页设计作业 静态HTML我的班级网页 DW班级网站模板下载 大学生简单班级网页作品代码 我的大学网页制作 学生班级网页设计作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

LeetCode刷题复盘笔记—一文搞懂动态规划之121. 买卖股票的最佳时机问题(动态规划系列第二十篇)

今日主要总结一下动态规划的一道题目&#xff0c;121. 买卖股票的最佳时机 题目&#xff1a;121. 买卖股票的最佳时机 Leetcode题目地址 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一…

QML入门教程:QML和QtQuick简介以及QML实例

从 Qt 4.7 开始&#xff0c;Qt 引入了一种声明式脚本语言&#xff0c;称为 QML&#xff08;Qt Meta Language 或者 Qt Modeling Language&#xff09;&#xff0c;作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。…

激光焊接3系铝合金的工艺分析

随着汽车行业的不断壮大&#xff0c;纯电动汽车和燃料电池汽车将共同主导中国新能源汽车市场的未来发展。电动车轻量化和燃料电池的大量使用&#xff0c;必然涉及到越来越多的铝合金焊接工艺。铝合金具有良好的物理、化学和机械性能&#xff0c;是工业生产中一种重要的轻金属材…

搜索引擎搜索特定网站的方法 :site

前言 从13开始的贴吧时代&#xff0c;还记得当时在贴吧里要搜索某些特定的帖子或者关键字的时候&#xff0c;用的都是“吧内搜索”&#xff0c;但用过的人都知道&#xff0c;这个所谓的吧内搜索其实很难用&#xff0c;大家都是用关键字空格贴吧之类的办法去搜索相关的内容。我…

2025年350万辆市场空间!舱驾一体「抢」行泊/舱泊风头

过去三年是汽车智能化「细分作战」阶段&#xff0c;无论是智能驾驶还是智能座舱&#xff0c;由于品牌、车型定位不同&#xff0c;导致在不同价位区间、不同品牌、不同车型&#xff0c;舱内舱外智能化功能组合并不一致。 而随着跨域融合、中央计算平台带动汽车行业进入新的增长…

《树莓派项目实战》第九节 使用PCF8591模块和光敏电阻传感器测量光照强度

目录 8.1 PCF8691模块引脚介绍 8.2 工作原理 8.3 开启I2C接口 8.4 连接到树莓派 8.5 编写代码测量光照强度 在上一节我们使用光敏电阻传感器检测了环境中的光照是否达到了设定的阈值。在本节&#xff0c;我们将使用PCF8591模块和光敏电阻度传感器测量环境中光照强度的具体…

Continua CI捆绑的PostgreSQL数据库服务

Continua CI捆绑的PostgreSQL数据库服务 捆绑的PostgreSQL数据库服务已升级到15.1版。 现在可以使用表达式和变量在“配置存储库分支映射”对话框中为每个存储库指定默认分支。 在“停止”操作中添加了“将失败视为错误”选项。如果选中此项并且该操作位于“Try”块内&#xff…

Qt 模型视图编程之可编辑数据模型

背景 Qt 模型视图编程中模型定义了标准接口对数据进行访问&#xff0c;可根据需求继承对应的抽象模型类来实现自定义的数据模型。一个基本的数据模型至少要实现以下虚函数&#xff1a; ①&#xff0e;rowCount&#xff1a;行数&#xff0c;返回要显示多少行&#xff1b; ②&…

SpringBoot+Vue实现在线电子小说网站

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

伙伴福利,100个项目彻底精通Java!【开源】

为了帮助更多的小伙伴&#xff0c;快速成长进步&#xff0c;冲进大厂中厂&#xff0c;我分享了很多的项目哟&#xff0c;例如&#xff1a; java项目精品实战案例 | JavaSwing实战项目 但很多小伙伴&#xff0c;还觉得不够&#xff0c;好吧&#xff01;今天就拿出压箱底的项目…

CPU工作原理概述

为了了解CPU的完整工作过程&#xff0c;我们需要知道两件事&#xff0c;第一&#xff0c;CPU是如何获取到数据或者指令的&#xff1b;第二&#xff0c;CPU是如何执行指令的。 目录 一、CPU和内存的交互方式 1、地址空间的概念 2、CPU的取值过程 二、CPU内部的执行过程 1、…

OceanBase-安装

文章目录部署规划机器准备统一配置hosts设置设置机器名和静态ip关闭大页配置信息查看时钟源ntp配置&#xff08;需要所有机器root&#xff09;磁盘规划创建用户配置limits.conf配置sysctl.conf关闭防火墙关闭SELinux克隆虚拟机差异化配置中控机设置无密码SSH登录目标机器时钟源…

【推送位置苹果群发iMessage推】如果Windows和Linux实现不同的传输层协议,那末因为数据格式的不同

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

Qt-Web混合开发-QWebEngineView加载网页最小示例(2)

Qt-Web混合开发-QWebEngineView加载网页最小示例 2&#x1f30d; 文章目录Qt-Web混合开发-QWebEngineView加载网页最小示例 2&#x1f30d;1、概述&#x1f310;2、实现效果&#x1f9ed;3、实现功能&#x1f685;4、关键代码&#x1f69a;5、源代码&#x1f680;更多精彩内容&…

高斯定理的理解——工程电磁场 P2~P5

证明&#xff1a;静电场是无旋场 根据斯托克斯公式上式等于 电位的引入 由于静电场是无源场&#xff0c;我们可以得到 又因为 再结合电场的物理意义&#xff0c;我们可以定义 功函数表达式的化简 原先功函数表达式 高斯定律的理解 不管是导体还是电解质&#xff0c;对于电…

【图像处理】FAST、BRIEF、ORB算法原理

整理FAST、BRIEF、ORB算法的原理。 FAST算法 一、FAST简介 FAST&#xff08;features from accelerated segment test&#xff09;是一种角点检测算法&#xff0c;可以用于提取特征点&#xff0c;后来也长用于目标跟踪等计算机视觉任务中。FAST角点检测算法最初由 Edward Ro…