[Qt教程] 第33篇 网络(三)FTP(一)

简介:
楼主
  发表于 2013-9-4 14:52:46  | 查看: 392 | 回复: 8
FTP(一)


版权声明

该文章原创于作者yafeilinux,转载请注明出处!



导语

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


环境: Windows Xp + Qt 4.8.5+QtCreator 2.8.0


目录

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


正文


一、简介

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

01.jpg


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

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

02.jpg


二、实现简单的文件下载

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

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

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

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 )在构造函数中添加代码:
  1. ftp = new QFtp(this);
  2. ftp->connectToHost("ftp.qt-project.org"); //连接到服务器
  3. ftp->login();   //登录
  4. ftp->cd("qt/source");   //跳转到“qt”目录下的source目录中
  5. ftp->get("INSTALL");  //下载“INSTALL”文件
  6. ftp->close();   //关闭连接

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

  10. // 当每条命令执行结束时发出相应的信号
  11. connect(ftp,SIGNAL(commandFinished(int,bool)),
  12.         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 ,它标志现在执行的命令是否出现了错误。如果出现了错误,那么error  true  ,否则为false 。我们可以利用它来输出错误信息。在这个函数中,我们在完成一条命令时显示不同的状态信息,并显示可能的出错信息。在if (ftp->currentCommand() == QFtp::Get)  中,也就是已经完成下载时,我们让textBrowser 显示下载的信息。


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

04.jpg


7.出错演示。
下面我们演示一下出错时的情况。
将构造函数中的代码ftp->login(); 改为ftp->login("tom","123456");
这时我们再运行程序:
05.jpg

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



结语

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




涉及的源码下载:  myFtp1.rar (2.09 KB, 下载次数: 1) 


相关文章
|
3月前
|
SQL 安全 算法
爆赞!终于有大佬把网络安全零基础入门教程给讲明白了!
网络安全的一个通用定义指网络信息系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的破坏、更改、泄露,系统能连续、可靠、正常地运行,服务不中断。网络安全简单的说是在网络环境下能够识别和消除不安全因素的能力。 网络安全在不同环境和应用中有不同的解释,例如系统运行的安全、系统信息内容的安全、信息通信与传播的安全等。 网络安全的主体是保护网络上的数据和通信的安全,数据安全性是指软硬件保护措施,用来阻止对数据进行非授权的泄漏、转移、修改和破坏等,通信安全性是通信保护措施,要求在通信中采用保密安全性、传输安全性、辐射安全性等措施。
|
13天前
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
在网络技术飞速发展的今天,掌握网络编程已成为开发者的重要技能。本文以Python为工具,带你从Socket编程基础逐步深入至进阶领域。首先介绍Socket的概念及TCP/UDP协议,接着演示如何用Python创建、绑定、监听Socket,实现数据收发;最后通过构建简单的聊天服务器,巩固所学知识。让初学者也能迅速上手,成为网络编程高手。
49 1
|
2月前
|
API
|
2月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
75 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
2月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
2月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03
|
2月前
|
SQL 运维 安全
GitHub爆赞的Web安全防护指南,网络安全零基础入门必备教程!
web安全现在占据了企业信息安全的很大一部分比重,每个企业都有对外发布的很多业务系统,如何保障web业务安全也是一项信息安全的重要内容。 然而Web 安全是一个实践性很强的领域,需要通过大量的练习来建立对漏洞的直观认识,并积累解决问题的经验。 Web安全与防护技术是当前安全界关注的热点,今天给小伙伴们分享的这份手册尝试针对各类漏洞的攻防技术进行体系化整理,从漏洞的原理到整体攻防技术演进过程进行详细讲解,从而形成对漏洞和web安全的体系化的认识。
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
【Macos系统】安装VOSviewer及使用VOSviewer教程!!以ESN网络的研究进行案例分析
本文介绍了如何在MacOS系统上安装VOSviewer软件,并以ESN(Echo State Network)网络的研究为例,通过VOSviewer对相关科学文献进行可视化分析,以深入了解ESN在学术研究中的应用和发展情况。
116 0
【Macos系统】安装VOSviewer及使用VOSviewer教程!!以ESN网络的研究进行案例分析
|
2月前
|
SQL 运维 安全
GitHub爆赞的Web安全防护指南,网络安全零基础入门必备教程!
web安全现在占据了企业信息安全的很大一部分比重,每个企业都有对外发布的很多业务系统,如何保障web业务安全也是一项信息安全的重要内容。 然而Web 安全是一个实践性很强的领域,需要通过大量的练习来建立对漏洞的直观认识,并积累解决问题的经验。 Web安全与防护技术是当前安全界关注的热点,今天给小伙伴们分享的这份手册尝试针对各类漏洞的攻防技术进行体系化整理,从漏洞的原理到整体攻防技术演进过程进行详细讲解,从而形成对漏洞和web安全的体系化的认识。
下一篇
无影云桌面