其實就是依次上傳每個文件,我把服務器和客戶端放在同一個界面了,方便調試,實際代碼是分開的。
我發現每次上傳文件必須重新建立鏈接,而無法使用一個連接,沒有深入測試,按理來說,使用同一次連接應該也是可行的。
目前得到的效果如下,目標目錄的結果與源目錄結構完全相同。
主要源碼記錄如下:
#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);
}
}
歡迎交流與討論。