QT使用tcp協議實現上傳文件夾服務端與客戶端

其實就是依次上傳每個文件,我把服務器和客戶端放在同一個界面了,方便調試,實際代碼是分開的。

我發現每次上傳文件必須重新建立鏈接,而無法使用一個連接,沒有深入測試,按理來說,使用同一次連接應該也是可行的。

目前得到的效果如下,目標目錄的結果與源目錄結構完全相同。

主要源碼記錄如下:

#ifndef TRANSSERVERCLIENT_H
#define TRANSSERVERCLIENT_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class TransServerClient; }
QT_END_NAMESPACE

class TransServerClient : public QMainWindow
{
    Q_OBJECT

public:
    TransServerClient(QWidget *parent = nullptr);
    ~TransServerClient();

public slots:
    void outputMessage(QtMsgType, const QMessageLogContext &, const QString &);

    //客戶端
    void uploadProgress(qint64, qint64);
    void uploadFinished();

    //服務端
    void beginReceive();
    void receiveProgress(qint64, qint64);
    void receiveFinished();

private slots:
    void on_btn_upload_clicked();

private:
    Ui::TransServerClient *ui;
};
#endif // TRANSSERVERCLIENT_H

然後是cpp文件:

#include "transserverclient.h"
#include "ui_transserverclient.h"
#include "MsgHandlerWapper.h"
#include <QDebug>
#include "TcpUploadServer.h"
#include "HttpDownload.h"
#include "TcpUploadClient.h"
#include "QtDirFile.h"

TransServerClient::TransServerClient(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::TransServerClient)
{
    connect(MsgHandlerWapper::instance(),
            SIGNAL(message(QtMsgType, const QMessageLogContext &, const QString &)),
            this, SLOT(outputMessage(QtMsgType, const QMessageLogContext &, const QString &)));
    ui->setupUi(this);

    ui->lb_serverProgress->hide();
    ui->pb_server->reset();
    ui->pb_server->hide();
    ui->lb_clientProgress->hide();
    ui->pb_client->reset();
    ui->pb_client->hide();

    //默認直接啓動服務器
    TcpUploadServer *server = new TcpUploadServer(this);
    connect(server, SIGNAL(begin()), this, SLOT(beginReceive()));
    connect(server, SIGNAL(progress(qint64, qint64)), this, SLOT(receiveProgress(qint64, qint64)));
    connect(server, SIGNAL(finished()), this, SLOT(receiveFinished()));
    server->SetSaveRootDirPath("Received");
    server->SetLableStatus(ui->lb_StatusServer);
    server->SetPort(9999);
    server->StartServer();
}

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

void TransServerClient::outputMessage(QtMsgType, const QMessageLogContext &, const QString & msg)
{
    ui->textBrowser->append(msg);
}

void TransServerClient::uploadProgress(qint64 m_bytesSend, qint64 m_totalBytes)
{
    ui->pb_client->setValue(m_bytesSend);
    ui->pb_client->setMaximum(m_totalBytes);
}

void TransServerClient::uploadFinished()
{
    ui->lb_clientProgress->hide();
    ui->pb_client->hide();
    ui->pb_client->reset();
}

void TransServerClient::beginReceive()
{
    ui->pb_server->reset();
    ui->pb_server->show();
}

void TransServerClient::receiveProgress(qint64 m_bytesReceived, qint64 m_totalBytes)
{
    ui->pb_server->setValue(m_bytesReceived);
    ui->pb_server->setMaximum(m_totalBytes);
}

void TransServerClient::receiveFinished()
{
    ui->pb_server->reset();
}

void TransServerClient::on_btn_upload_clicked()
{
    QString strDirPath = QTDirFile::BrowseDir(this);

    if (strDirPath.length())
    {
        ui->le_uploadFilePath->setText(strDirPath);
        ui->lb_clientProgress->show();
        ui->pb_client->show();

        ThreadUploadList *tul = new ThreadUploadList;
        connect(tul, SIGNAL(progress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));
        connect(tul, SIGNAL(finished(bool)), this, SLOT(uploadFinished()));
        tul->SetHostAndPort("localhost", 9999);
        //tuc->SetLineEditHostAndPort(ui->lineEditUrl,  ui->lineEditPort);
        tul->SetLableStatus(ui->lb_StatusClient);

        //讀取目錄中的文件,對每一個文件分別上傳

        QStringList lFilePathNames, lServerPathNames;
        int nFileCount = QTDirFile::getFiles(strDirPath, lFilePathNames);

        for (int i = 0; i < nFileCount; ++i)
        {
            QString strCurFilePath = lFilePathNames[i];
            QString strDstSubPath = strCurFilePath.mid(strDirPath.length() + 1);
            lServerPathNames.push_back(strDstSubPath);
        }

        //批量上傳多個文件,需要建立多次連接
        tul->StartUploadFiles(lFilePathNames, lServerPathNames);
    }
}

歡迎交流與討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章