其实就是依次上传每个文件,我把服务器和客户端放在同一个界面了,方便调试,实际代码是分开的。
我发现每次上传文件必须重新建立链接,而无法使用一个连接,没有深入测试,按理来说,使用同一次连接应该也是可行的。
目前得到的效果如下,目标目录的结果与源目录结构完全相同。
主要源码记录如下:
#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);
}
}
欢迎交流与讨论。