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);
    }
}

欢迎交流与讨论。

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