Network programming using Qt 3 ftp1 QNetworkAccessManager

        FTP (File transfer protocol, file transfer protocol) is a protocol mainly used for browsing remote directories and transfer files. FTP two network connections, to send a command to a data output. FTP protocol has a state, and the client needs to send some command before transferring files. FTP client establishes a connection, and remains open during the entire session. During each session, a plurality of transmission may occur.

        When writing in Qt5 FTP application, you need to use QNetworkAccessManager and other network access interface class. Implementation of the previous mentioned HTTP application is very similar, just set a good host addresses, user names and passwords in QUrl object, and then use the get (), put () functions such as file access and upload to complete.

myftp.pro, add network module

QT       += network

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUrl>
class QNetworkReply;
class QNetworkAccessManager;
class QFile;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void startRequest(QUrl url);
private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *manager;
    QNetworkReply *reply;
    QUrl url;
    QFile *file;

private slots:
    void httpFinished();
    void httpReadyRead();
    void updateDataReadProgress(qint64,qint64);
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkAccessManager>
#include <QtNetwork>
#include <QFile>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    ui->progressBar->hide();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::startRequest(QUrl url,bool bSend)
{
    if (!bSend) {
        reply = manager->get(QNetworkRequest(url));
        connect(reply,&QNetworkReply::readyRead,this,&MainWindow::httpReadyRead);
        connect(reply,&QNetworkReply::downloadProgress,this,&MainWindow::updateDataReadProgress);
        connect(reply,&QNetworkReply::finished,this,&MainWindow::httpFinished);
    } else {
        QString fileName = "e:/XunLei.exe";
        QFile file(fileName);
        QByteArray by_txt;
        if (file.open(QIODevice::ReadOnly))
        {
            by_txt = file.readAll();
            file.close();
            reply = manager->put(QNetworkRequest(url),by_txt);
        }
        connect(reply,&QNetworkReply::finished,this,&MainWindow::httpFinished);
    }

}

void MainWindow::httpFinished()
{
    ui->progressBar->hide();
    if (file) {
        file->close();
        delete file;
        file = 0;
    }
    reply->deleteLater();
    reply = 0;
    qDebug()<<"send complete";
}

void MainWindow::httpReadyRead()
{
    if (file) {
        file->write(reply->readAll());
    }
}

void MainWindow::updateDataReadProgress(qint64 bytesRead,qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}




void MainWindow::on_pushButton_clicked()
{
    //url = ui->lineEdit->text();
    QUrl url;
    url.setScheme("ftp");
    url.setHost("192.168.1.9");
    url.setPath("qt-opensource-windows-x86-msvc2015_64-5.7.1.exe");
    url.setUserName("adminFtp");
    url.setPassword("123456");

    QFileInfo info(url.path());
    QString fileName(info.fileName());
    if (fileName.isEmpty()) {
        fileName = "index.html";
    }
    file = new QFile(fileName);
    if (!file->open(QIODevice::WriteOnly)) {
        delete file;
        file = 0;
        return;
    }
    startRequest(url,false);
    ui->progressBar->setValue(0);
    ui->progressBar->show();
}

void MainWindow::on_pushButton_2_clicked()
{
    QUrl url;
    url.setScheme("ftp");
    url.setHost("192.168.1.9");
    url.setPath("XunLei.exe");// 目标文件名
    url.setUserName("adminFtp");
    url.setPassword("123456");

    startRequest(url,true);
    ui->progressBar->setValue(0);
    ui->progressBar->show();
}

operation result:

 

Published 257 original articles · won praise 22 · views 90000 +

Guess you like

Origin blog.csdn.net/qq_24127015/article/details/104669995