解析 Qt 網(wǎng)絡(luò)之FTP 網(wǎng)絡(luò)學(xué)習(xí)基礎(chǔ)
Qt 網(wǎng)絡(luò)之FTP 網(wǎng)絡(luò)學(xué)習(xí)基礎(chǔ)是本文要介紹的內(nèi)容,先來可能內(nèi)容。FTP即File Transfer Protocol,也就是文件傳輸協(xié)議。FTP的主要作用,就是讓用戶連接上一個遠(yuǎn)程計算機(jī),查看遠(yuǎn)程計算機(jī)有哪些文件,然后把文件從遠(yuǎn)程計算機(jī)上拷貝到本地計算機(jī),或者把本地計算機(jī)的文件送到遠(yuǎn)程計算機(jī)上。
在Qt中,我們可以使用上一節(jié)講述的QNetworkAccessManager和QNetworkReply類來進(jìn)行FTP 程序的編寫,因為它們用起來很簡單。但是,對于較復(fù)雜的FTP操作,Qt還提供了QFtp類,利用這個類,我們很容易寫出一個FTP客戶端程序。下面我們先在幫助中查看這個類。
在QFtp中,所有的操作都對應(yīng)一個特定的函數(shù),我們可以稱它們?yōu)槊睢H鏲onnectToHost()連接到服務(wù)器命令,login()登錄命令,get()下載命令,mkdir()新建目錄命令等。因為QFtp類以異步方式工作,所以所有的這些函數(shù)都不是阻塞函數(shù)。也就是說,如果一個操作不能立即執(zhí)行,那么這個函數(shù)就會直接返回,直到程序控制權(quán)返回Qt事件循環(huán)后才真正執(zhí)行,它們不會影響界面的顯示。
所有的命令都返回一個int 型的編號,使用這個編號讓我們可以跟蹤這個命令,查看其執(zhí)行狀態(tài)。當(dāng)每條命令開始執(zhí)行時,都會發(fā)出commandStarted()信號,當(dāng)該命令執(zhí)行結(jié)束時,會發(fā)出commandFinished()信號。我們可以利用這兩個信號和命令的編號來獲取命令的執(zhí)行狀態(tài)。當(dāng)然,我們不想執(zhí)行每條命令都要記下它的編號,所以我們也可以使用currentCommand()來獲取現(xiàn)在執(zhí)行的命令,其返回值與命令的對應(yīng)關(guān)系如下圖。
下面我們先看一個簡單的FTP客戶端的例子,然后對它進(jìn)行擴(kuò)展。
在這個例子中我們從FTP服務(wù)器上下載一個文件并顯示出來。
1、我們新建Qt4 Gui QApplication 。
工程名為“myFtp”,然后選中QtNetwork模塊,最后Base class選擇QWidget 。
2、修改widget.ui文件。
在其中添加一個Text Browser 和一個 Label,效果如下。
3、在main.cpp中進(jìn)行修改。
為了在程序中可以使用中文,我們在main.cpp中添加頭文件#include <QTextCodec>
并在main()函數(shù)中添加代碼:QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
#p#
4、在widget.h中進(jìn)行修改。
先添加頭文件:#include <QFtp>
再在private中定義對象:QFtp *ftp;
添加私有槽函數(shù):
- private slots:
- void ftpCommandStarted(int);
- void ftpCommandFinished(int,bool);
5、在widget.cpp中進(jìn)行更改。
(1)在構(gòu)造函數(shù)中添加代碼:
- ftp = new QFtp(this);
- ftp->connectToHost(“ftp.qt.nokia.com”); //連接到服務(wù)器
- ftp->login(); //登錄
- ftp->cd(“qt”); //跳轉(zhuǎn)到“qt”目錄下
- ftp->get(“INSTALL”); //下載“INSTALL”文件
- ftp->close(); //關(guān)閉連接
- connect(ftp,SIGNAL(commandStarted(int)),
- this,SLOT(ftpCommandStarted(int)));
- //當(dāng)每條命令開始執(zhí)行時發(fā)出相應(yīng)的信號
- connect(ftp,SIGNAL(commandFinished(int,bool)),
- this,SLOT(ftpCommandFinished(int,bool)));
- //當(dāng)每條命令執(zhí)行結(jié)束時發(fā)出相應(yīng)的信號
我們在構(gòu)造函數(shù)里執(zhí)行了幾個FTP的操作,登錄站點,并下載了一個文件。然后我們又關(guān)聯(lián)了兩個信號和槽,用來跟蹤命令的執(zhí)行情況。
(2)實現(xiàn)槽函數(shù):
- void Widget::ftpCommandStarted(int)
- {
- if(ftp->currentCommand() == QFtp::ConnectToHost){
- ui->label->setText(tr(“正在連接到服務(wù)器…”));
- }
- 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(“正在關(guān)閉連接…”));
- }
- }
每當(dāng)命令執(zhí)行時,都會執(zhí)行ftpCommandStarted()函數(shù),它有一個參數(shù)int id,這個id就是調(diào)用命令時返回的id,如int loginID = ftp->login(); 這時,我們就可以用if(id == loginID)來判斷執(zhí)行的是否是login()函數(shù)。但是,我們不想為每個命令都設(shè)置一個變量來存儲其返回值,所以,我們這里使用了ftp->currentCommand() ,它也能獲取當(dāng)前執(zhí)行的命令的類型。在這個函數(shù)里我們讓開始不同的命令時顯示不同的狀態(tài)信息。
- void Widget::ftpCommandFinished(int,bool error)
- {
- if(ftp->currentCommand() == QFtp::ConnectToHost){
- if(error) ui->label->setText(tr(“連接服務(wù)器出現(xiàn)錯誤:%1″).arg(ftp->errorString()));
- else ui->label->setText(tr(“連接到服務(wù)器成功”));
- }
- if (ftp->currentCommand() == QFtp::Login){
- if(error) ui->label->setText(tr(“登錄出現(xiàn)錯誤:%1″).arg(ftp->errorString()));
- else ui->label->setText(tr(“登錄成功”));
- }
- if (ftp->currentCommand() == QFtp::Get){
- if(error) ui->label->setText(tr(“下載出現(xiàn)錯誤:%1″).arg(ftp->errorString()));
- else {
- ui->label->setText(tr(“已經(jīng)完成下載”));
- ui->textBrowser->setText(ftp->readAll());
- }
- }
- else if (ftp->currentCommand() == QFtp::Close){
- ui->label->setText(tr(“已經(jīng)關(guān)閉連接”));
- }
- }
這個函數(shù)與ftpCommandStarted()函數(shù)相似,但是,它是在一個命令執(zhí)行結(jié)束時執(zhí)行的。它有兩個參數(shù),第一個int id,就是調(diào)用命令時返回的編號,我們在上面已經(jīng)講過了。第二個是bool error,它標(biāo)志現(xiàn)在執(zhí)行的命令是否出現(xiàn)了錯誤。如果出現(xiàn)了錯誤,那么error 為true ,否則為false。我們可以利用它來輸出錯誤信息。在這個函數(shù)中,我們在完成一條命令時顯示不同的狀態(tài)信息,并顯示可能的出錯信息。在if (ftp->currentCommand() == QFtp::Get) 中,也就是已經(jīng)完成下載時,我們讓textBrowser顯示下載的信息。
#p#
6、運行程序,效果如下。
登錄狀態(tài)。
下載完成后。
7.出錯演示。
下面我們演示一下出錯時的情況。
將構(gòu)造函數(shù)中的代碼ftp->login();改為ftp->login(“tom”,”123456″);
這時我們再運行程序:
可以看到,它輸出了錯誤信息,指明了錯誤的指令和出錯的內(nèi)容。其實我們設(shè)置的這個錯誤,也是想告訴大家,在FTP中如果沒有設(shè)置用戶名和密碼,那么默認(rèn)的用戶名應(yīng)該是anonymous,這時密碼可以任意填寫,而使用其他用戶名是會出錯的。
在下一節(jié)中,我們將會對這個程序進(jìn)行擴(kuò)展,讓它可以瀏覽服務(wù)器上的所有文件,并進(jìn)行下載。
本文來自:www.yafeilinux.com
小結(jié):Qt 網(wǎng)絡(luò)之FTP 網(wǎng)絡(luò)學(xué)習(xí)基礎(chǔ)的內(nèi)容介紹完了,更多內(nèi)容,請參考編輯推薦。給大家推薦與此文相關(guān)的幾篇文章,供您參考。
http://mobile.51cto.com/symbian-268176.htm qt網(wǎng)絡(luò)
http://mobile.51cto.com/symbian-268170.htm http 編程
http://mobile.51cto.com/symbian-268167_1.htm 獲取網(wǎng)絡(luò)地址