切换多域名下载,提高下载速度

This commit is contained in:
metanoia1989 2021-02-20 06:47:57 +08:00
parent 2f8c11a30b
commit 9cc68fac86
2 changed files with 22 additions and 2 deletions

@ -6,6 +6,7 @@
#include <QNetworkReply>
#include <QDebug>
#include <QThread>
#include <QRegularExpression>
DownloadWorker::DownloadWorker(QObject *parent)
{
@ -87,7 +88,14 @@ void DownloadWorker::handleProcess(qint64, qint64)
DownloadController::DownloadController(QObject *parent)
{
this->threadNum = QThread::idealThreadCount() > 4 ? 4 : QThread::idealThreadCount();
domains = {
"sucdn1.jerrywang.top",
"sucdn2.jerrywang.top",
"sucdn3.jerrywang.top",
"sucdn4.jerrywang.top",
"sucdn5.jerrywang.top"
};
this->threadNum = domains.size() > 6 ? 6 : domains.size();
}
DownloadController::~DownloadController()
@ -151,8 +159,9 @@ void DownloadController::startDownload(const QString &url)
qDebug() << QString("第%1个下载请求%2-%3").arg(i).arg(ranges.at(i).first).arg(ranges.at(i).second);
auto worker = new DownloadWorker(this);
auto range = ranges.at(i);
QString chunkUrl = replaceDomain(url, domains.at(i));
worker->setIdentifier(i);
worker->setParamter(url, range, file);
worker->setParamter(chunkUrl, range, file);
workers.append(worker);
connect(worker, &DownloadWorker::downloadProcess, this, &DownloadController::handleProcess);
connect(worker, &DownloadWorker::workFinished, this, &DownloadController::chunkDownloadFinish);
@ -232,3 +241,12 @@ qint64 DownloadController::getFileSize(const QString& url)
return fileSize;
}
QString DownloadController::replaceDomain(const QString& url, const QString domain)
{
QRegularExpression regex(R"((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9])");
if (regex.match(url).hasMatch()) {
return QString(url).replace(regex.match(url).captured(), domain);
}
return url;
}

@ -50,6 +50,7 @@ public:
void startDownload(const QString &url);
void stopDownload();
qint64 getFileSize(const QString& url);
QString replaceDomain(const QString& url, const QString domain);
public slots:
void handleProcess();
@ -68,6 +69,7 @@ private:
QFile *file;
QList<DownloadWorker*> workers;
int finish = 0;
QVector<QString> domains;
};
#endif // FILEDOWNLOADWORKER_H