diff --git a/CMakeLists.txt b/CMakeLists.txt index 61414ea..81c3ae7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(frelay VERSION 0.1 LANGUAGES CXX) +project(frelay VERSION 0.2 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -20,7 +20,7 @@ endif() if(WIN32) if(DEFINED XP_PLATFORM_SUPPORT) -message(STATUS "For Windows XP platform.") +message(STATUS "Support Windows XP platform.") add_definitions(-D_WIN32_WINNT=0x0501) else() add_definitions(-D_WIN32_WINNT=0x0601) diff --git a/ClientCore/ClientCore.cpp b/ClientCore/ClientCore.cpp index ecd3f7b..e364c1a 100644 --- a/ClientCore/ClientCore.cpp +++ b/ClientCore/ClientCore.cpp @@ -74,7 +74,7 @@ void ClientCore::onReadyRead() void ClientCore::onDisconnected() { connected_ = false; - qCritical() << QString("client %1 disconnected...").arg(remoteID_); + qCritical() << QString("You [%1] disconnected...").arg(ownID_); emit sigDisconnect(); } diff --git a/Console/Console.cpp b/Console/Console.cpp index d4261e2..940dc4a 100644 --- a/Console/Console.cpp +++ b/Console/Console.cpp @@ -13,6 +13,8 @@ void ConsoleHelper::RunWorker(ClientCore* clientCore) clientCore_ = clientCore; sockWorker_ = new SocketWorker(clientCore_, nullptr); + heatBeat_ = new HeatBeat(clientCore_); + clientCore_->moveToThread(sockWorker_); fileTrans_ = new FileTrans(clientCore_); @@ -24,6 +26,7 @@ void ConsoleHelper::RunWorker(ClientCore* clientCore) connect(sockWorker_, &QThread::finished, sockWorker_, &QObject::deleteLater); sockWorker_->start(); + heatBeat_->start(); } void ConsoleHelper::SetIpPort(const QString& ip, quint16 port) diff --git a/Console/Console.h b/Console/Console.h index 16d2284..5aab3e5 100644 --- a/Console/Console.h +++ b/Console/Console.h @@ -25,6 +25,7 @@ private: quint16 port_{}; FileTrans* fileTrans_{}; SocketWorker* sockWorker_{}; + HeatBeat* heatBeat_{}; ClientCore* clientCore_; }; diff --git a/Console/main.cpp b/Console/main.cpp index dfdf50a..c7dbce7 100644 --- a/Console/main.cpp +++ b/Console/main.cpp @@ -25,6 +25,11 @@ int main(int argc, char* argv[]) #endif #endif + qRegisterMetaType>("QSharedPointer"); + qRegisterMetaType("InfoClientVec"); + qRegisterMetaType("DirFileInfoVec"); + qRegisterMetaType("TransTask"); + QCoreApplication app(argc, argv); Util::InitLogger("frelayConsole.log", "frelayConsole"); diff --git a/Gui/Control/ConnectControl.cpp b/Gui/Control/ConnectControl.cpp index 142cd23..64f334d 100644 --- a/Gui/Control/ConnectControl.cpp +++ b/Gui/Control/ConnectControl.cpp @@ -24,6 +24,7 @@ void Connecter::RunWorker(ClientCore* clientCore) connect(clientCore_, &ClientCore::sigClients, this, &Connecter::HandleClients); sockWorker_ = new SocketWorker(clientCore_, nullptr); + heatBeat_ = new HeatBeat(clientCore_); clientCore_->moveToThread(sockWorker_); connect(clientCore_, &ClientCore::conSuccess, this, [this]() { @@ -50,6 +51,7 @@ void Connecter::RunWorker(ClientCore* clientCore) connect(this, &Connecter::sigDisConnect, clientCore_, &ClientCore::Disconnect); connect(sockWorker_, &QThread::finished, sockWorker_, &QObject::deleteLater); + heatBeat_->start(); sockWorker_->start(); } @@ -89,6 +91,7 @@ void Connecter::setState(ConnectState cs) ui->btnConnect->setEnabled(false); ui->btnDisconnect->setEnabled(true); RefreshClient(); + connect(heatBeat_, &HeatBeat::finished, heatBeat_, &QObject::deleteLater); break; case CS_DISCONNECT: ui->btnConnect->setEnabled(true); @@ -139,7 +142,8 @@ void Connecter::InitControl() ui->btnDisconnect->setEnabled(false); ui->edIP->setText("127.0.0.1"); ui->edPort->setText("9009"); - ui->edPort->setFixedWidth(70); + // ui->edIP->setMinimumWidth(120); + // ui->edPort->setFixedWidth(60); connect(ui->btnConnect, &QPushButton::clicked, this, &Connecter::Connect); connect(ui->btnRefresh, &QPushButton::clicked, this, &Connecter::RefreshClient); diff --git a/Gui/Control/ConnectControl.h b/Gui/Control/ConnectControl.h index 99b578d..a1b7d34 100644 --- a/Gui/Control/ConnectControl.h +++ b/Gui/Control/ConnectControl.h @@ -54,6 +54,7 @@ private: private: QMenu* menu_; SocketWorker* sockWorker_{}; + HeatBeat* heatBeat_{}; QStandardItemModel* model_; }; diff --git a/Gui/Control/ConnectControl.ui b/Gui/Control/ConnectControl.ui index 9486a34..617e5d9 100644 --- a/Gui/Control/ConnectControl.ui +++ b/Gui/Control/ConnectControl.ui @@ -6,8 +6,8 @@ 0 0 - 350 - 276 + 331 + 289 @@ -26,6 +26,30 @@ + + + + + + + + None + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + @@ -46,35 +70,7 @@ - - - - - Client: - - - - - - - None - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - + diff --git a/Gui/Control/LogControl.h b/Gui/Control/LogControl.h index cf49a20..accd42c 100644 --- a/Gui/Control/LogControl.h +++ b/Gui/Control/LogControl.h @@ -28,7 +28,7 @@ public: explicit LogPrint(QWidget* parent = nullptr); ~LogPrint(); -public: +public slots: void Info(const QString& message); void Warn(const QString& message); void Error(const QString& message); diff --git a/Gui/frelayGUI.cpp b/Gui/frelayGUI.cpp index a9c3ccd..9090632 100644 --- a/Gui/frelayGUI.cpp +++ b/Gui/frelayGUI.cpp @@ -1,6 +1,7 @@ #include "frelayGUI.h" #include +#include #include #include @@ -15,7 +16,11 @@ frelayGUI::frelayGUI(QWidget* parent) : QMainWindow(parent), ui(new Ui::frelayGU InitControl(); ControlSignal(); ControlLayout(); - resize(1500, 800); + + QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry(); + int width = static_cast(availableGeometry.width() * 0.8); + int height = static_cast(availableGeometry.height() * 0.6); + resize(width, height); setWindowTitle(QString(tr("frelay %1")).arg(VERSION_NUM)); @@ -95,15 +100,16 @@ void frelayGUI::ControlMsgHander(QtMsgType type, const QMessageLogContext& conte { switch (type) { case QtDebugMsg: - logPrint->Debug(msg); + QMetaObject::invokeMethod(logPrint, "Debug", Qt::QueuedConnection, Q_ARG(QString, msg)); break; case QtInfoMsg: - logPrint->Info(msg); + QMetaObject::invokeMethod(logPrint, "Info", Qt::QueuedConnection, Q_ARG(QString, msg)); break; case QtWarningMsg: - logPrint->Warn(msg); + QMetaObject::invokeMethod(logPrint, "Warn", Qt::QueuedConnection, Q_ARG(QString, msg)); break; default: + QMetaObject::invokeMethod(logPrint, "Error", Qt::QueuedConnection, Q_ARG(QString, msg)); logPrint->Error(msg); break; } diff --git a/Note/version.md b/Note/version.md index 1fdee42..70cb51e 100644 --- a/Note/version.md +++ b/Note/version.md @@ -12,10 +12,10 @@ | 序号 | 类型 | 内容 | 说明 | 基于版本 | 完成版本 | | :--: | :--: | ------------------------------------------------------------ | :--: | :------: | :------: | | 8 | 功能 | 文件浏览页面要支持按照类型排序,时间排序,和文件后缀筛选。 | | 0.1 | | -| 7 | 优化 | IP和Port宽度要合理一些,IP过小,Port宽度过大。 | | 0.1 | | +| 7 | 优化 | IP和Port宽度要合理一些,IP过小,Port宽度过大。 | | 0.1 | 0.2 | | 6 | 功能 | 比对控件添加可尝试目录浏览控件跳转到指定目录。 | | 0.1 | | -| 5 | 问题 | 未设置心跳包,导致超时被Server端踢出。 | 必改 | 0.1 | | +| 5 | 问题 | 未设置心跳包,导致超时被Server端踢出。 | 必改 | 0.1 | 0.2 | | 4 | 问题 | 重复链接Server会崩溃。 | | 0.1 | | -| 3 | 优化 | 首次启动时应当按照当前分辨率进行初始化大小,而不是指定大小。 | | 0.1 | | +| 3 | 优化 | 首次启动时应当按照当前分辨率进行初始化大小,而不是指定大小。 | | 0.1 | 0.2 | | 2 | 问题 | 当某个文件传输失败的时候,关闭传输窗口,再次传输显示已经在传输中。 | | 0.1 | | -| 1 | 问题 | Console端显示未注册QSharedPointer\类型 | | 0.1 | | +| 1 | 问题 | Console端显示未注册QSharedPointer\类型 | | 0.1 | 0.2 | diff --git a/Server/Server.cpp b/Server/Server.cpp index 8c0f6a0..21a39b5 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -7,6 +7,9 @@ #include "InfoMsg.h" #include "InfoPack.hpp" +#define NO_HEATBEAT_TIMEOUT (10) +#define MONITOR_HEART_SPED (10 * 1000) + Server::Server(QObject* parent) : QTcpServer(parent) { monitorTimer_ = new QTimer(this); @@ -27,7 +30,7 @@ bool Server::startServer(quint16 port) } qDebug() << "Server started on port" << serverPort(); - monitorTimer_->start(300000); + monitorTimer_->start(MONITOR_HEART_SPED); id_ = QString("0.0.0.0:%1").arg(serverPort()); return true; } @@ -101,7 +104,7 @@ void Server::onClientDisconnected() clients_.remove(clientId); } - qDebug() << "Client disconnected:" << clientId; + qDebug() << "Client disconnected:" << __LINE__ << clientId; socket->deleteLater(); } @@ -233,7 +236,8 @@ void Server::monitorClients() QWriteLocker locker(&rwLock_); for (auto it = clients_.begin(); it != clients_.end();) { - if (now - it.value()->connectTime > 300) { + auto t = now - it.value()->connectTime; + if (t > NO_HEATBEAT_TIMEOUT) { qDebug() << "Disconnecting inactive client:" << it.value()->id; it.value()->socket->disconnectFromHost(); it = clients_.erase(it);