From a2375700b1e817cb927275f9f05197db60d5e30e Mon Sep 17 00:00:00 2001 From: semenov Date: Thu, 18 Sep 2025 12:02:21 +0300 Subject: [PATCH] fix: big xml code --- ServerLMS/Data/PacketType.h | 54 ++++++++------- ServerLMS/Systems/processingsystem.cpp | 4 +- ServerLMS/Systems/recognizesystem.cpp | 34 ++++++++-- ServerLMS/Systems/sendsystem.cpp | 91 ++++++++++++++++++++------ ServerLMS/Systems/tools.h | 5 ++ 5 files changed, 141 insertions(+), 47 deletions(-) diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 1713daf..25db792 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -54,28 +54,38 @@ QString enumToString(T value); template<> inline QString enumToString(PacketType value) { switch(value) { - case PacketType::TYPE_NONE: return "TYPE_NONE"; - case PacketType::TYPE_UNITY: return "TYPE_UNITY"; - case PacketType::TYPE_FILE: return "TYPE_FILE"; - case PacketType::TYPE_COMMAND: return "TYPE_COMMAND"; - case PacketType::TYPE_FOLDER: return "TYPE_FOLDER"; - case PacketType::TYPE_DELETE: return "TYPE_DELETE"; - case PacketType::TYPE_FINISH: return "TYPE_FINISH"; - case PacketType::TYPE_NEEDUPDATE: return "TYPE_NEEDUPDATE"; - case PacketType::TYPE_XMLANSWER: return "TYPE_XMLANSWER"; - case PacketType::TYPE_QT: return "TYPE_QT"; - case PacketType::TYPE_DISABLE: return "TYPE_DISABLE"; - case PacketType::TYPE_UPDATE: return "TYPE_UPDATE"; - case PacketType::TYPE_CHECK_VERSION: return "TYPE_CHECK_VERSION"; - case PacketType::TYPE_FILESIZE: return "TYPE_FILESIZE"; - case PacketType::TYPE_BIGXML: return "TYPE_BIGXML"; - case PacketType::CHANGE_DATA_VERSION: return "CHANGE_DATA_VERSION"; - case PacketType::COPY_VERSION: return "COPY_VERSION"; - case PacketType::DELETE_DATA_VERSION: return "DELETE_DATA_VERSION"; - case PacketType::BUSY: return "BUSY"; - case PacketType::FREE: return "FREE"; - case PacketType::HASH_CALCULATE_START: return "HASH_CALCULATE_START"; - case PacketType::HASH_READY: return "HASH_READY"; + case PacketType::TYPE_NONE: return "TYPE_NONE"; + case PacketType::TYPE_UNITY: return "TYPE_UNITY"; + case PacketType::TYPE_FILE: return "TYPE_FILE"; + case PacketType::TYPE_COMMAND: return "TYPE_COMMAND"; + case PacketType::TYPE_FOLDER: return "TYPE_FOLDER"; + case PacketType::TYPE_DELETE: return "TYPE_DELETE"; + case PacketType::TYPE_FINISH: return "TYPE_FINISH"; + case PacketType::TYPE_NEEDUPDATE: return "TYPE_NEEDUPDATE"; + case PacketType::TYPE_XMLANSWER: return "TYPE_XMLANSWER"; + case PacketType::TYPE_QT: return "TYPE_QT"; + case PacketType::TYPE_DISABLE: return "TYPE_DISABLE"; + case PacketType::TYPE_UPDATE: return "TYPE_UPDATE"; + case PacketType::TYPE_CHECK_VERSION: return "TYPE_CHECK_VERSION"; + case PacketType::TYPE_FILESIZE: return "TYPE_FILESIZE"; + case PacketType::TYPE_BIGXML: return "TYPE_BIGXML"; + case PacketType::CHANGE_DATA_VERSION: return "CHANGE_DATA_VERSION"; + case PacketType::COPY_VERSION: return "COPY_VERSION"; + case PacketType::DELETE_DATA_VERSION: return "DELETE_DATA_VERSION"; + case PacketType::BUSY: return "BUSY"; + case PacketType::FREE: return "FREE"; + case PacketType::HASH_CALCULATE_START: return "HASH_CALCULATE_START"; + case PacketType::HASH_READY: return "HASH_READY"; + case PacketType::TYPE_XMLANSWER_MESSAGE_FOR_GUI: return "TYPE_XMLANSWER_MESSAGE_FOR_GUI"; + case PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_INSTRUCTORS: return "TYPE_XMLANSWER_QUERY_DB__LIST_INSTRUCTORS"; + case PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_GROUPS: return "TYPE_XMLANSWER_QUERY_DB__LIST_GROUPS"; + case PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES: return "TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES"; + case PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS: return "TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS"; + case PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS: return "TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS"; + case PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE: return "TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE"; + case PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE: return "TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE"; + case PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM: return "TYPE_XMLANSWER_QUERY_TASKS_XML_FIM"; + case PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM: return "TYPE_XMLANSWER_QUERY_TASKS_XML_AMM"; default: return "Unknown"; } diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 60d2d6c..7f0b291 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -523,7 +523,7 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif {//Клиент готов принять задания client->setReady(true); sendTaskListToUnity(client); - client->getSocket()->flush(); + //client->getSocket()->flush(); } else if(clientNotify.Code == commandStartTimerClient) { @@ -572,6 +572,8 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif { chatSystem->sendOldMessages(client->getClient()->getId()); } + + Logger::instance().log(client->getClient()->getLogin() + clientNotify.Code,LogLevel::DEBUG); } void ProcessingSystem::setCurrentDataInfo(DataInfo *dataInfo) diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index 652de37..d8d096b 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -81,7 +81,34 @@ void RecognizeSystem::recognize() } if (packetType != PacketType::TYPE_NONE) - Logger::instance().log("C: " + client->getLogin() + " RECEIVE pack " + enumToString(packetType),LogLevel::DEBUG); + { + QString result = enumToString(packetType); + Logger::instance().log(client->getLogin() + + " RECEIVE pack " + + result ,LogLevel::DEBUG); + //секция на случай прихода неизвестного пакета + if(result == "Unknown") + { + qDebug() << " State:" << socket->state(); + qDebug() << " Error:" << socket->error(); + qDebug() << " Bytes to write:" << socket->bytesToWrite(); + qDebug() << " Bytes available:" << socket->bytesAvailable(); + if(client->getTypeClient() == TypeClientAutorization::TYPE_UNITY_CLIENT) + { + data = socket->readAll(); + } + else + { + stream.startTransaction(); + stream >> data; + } + QString dataText = QString::fromUtf8(data); + Logger::instance().log(QString::number(packetType) + " Unknown text " + dataText); + Logger::instance().log("Client error: " + client->getLogin(),LogLevel::ERROR); + clientHandler->sendDisable(); + //mutex->unlock(); + } + } if (packetType == PacketType::TYPE_COMMAND) //TODO: надо переделать под какой то нормальный тип, который уже существует { @@ -138,12 +165,11 @@ void RecognizeSystem::recognize() socket->read(readBuffer,4); fileSize = *((int*)readBuffer); - stream.commitTransaction(); - //if(!) continue; + //if(!stream.commitTransaction()) continue; //ПОЛУЧЕНИЕ САМОГО ФАЙЛА Logger::instance().log("AfterRead size and path BytesAvailable: " + QString::number(socket->bytesAvailable())); - qint64 readSize = 65535; + qint64 readSize = readFileBlockSize; forever { diff --git a/ServerLMS/Systems/sendsystem.cpp b/ServerLMS/Systems/sendsystem.cpp index 780deaf..f28bd44 100644 --- a/ServerLMS/Systems/sendsystem.cpp +++ b/ServerLMS/Systems/sendsystem.cpp @@ -61,7 +61,7 @@ void SendSystem::sendFileBlock(QString path) { while(!file.atEnd()) { - QByteArray data = file.read(1025*250); + QByteArray data = file.read(sendFileBlockSize); stream << data; //socket->waitForBytesWritten(10); @@ -78,35 +78,86 @@ void SendSystem::sendFileBlock(QString path) void SendSystem::sendFileBlockByteArray(QByteArray array, PacketType packetType) { - qDebug() << "sendFileBlockByteArray thread: " << QThread::currentThreadId(); +// qDebug() << "sendFileBlockByteArray thread: " << QThread::currentThreadId(); +// if(client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT || +// client->getClientType() == TypeClientAutorization::TYPE_GUI) +// { +// QDataStream stream(socket); +// stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + +// fileSize = array.size(); + +// if(fileSize == 0){ +// Logger::instance().log(" WARNING! Zero size ",LogLevel::ERROR); +// return; +// } + +// stream << packetType; //Отправляем тип блока +// stream << fileSize; +// stream << array; +// } +// else +// { +// sendPacketType(packetType); +// QByteArray message; +// int size = array.length(); +// message.append(reinterpret_cast(&size), sizeof(int)); +// socket->write(message); +// socket->write(array); +// } + if(client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT || - client->getClientType() == TypeClientAutorization::TYPE_GUI) + client->getClientType() == TypeClientAutorization::TYPE_GUI) { QDataStream stream(socket); stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); - fileSize = array.size(); + quint64 size = array.size(); + qint64 bytesSended = 0; - if(fileSize == 0){ - Logger::instance().log(" WARNING! Zero size ",LogLevel::ERROR); - return; - } + if (size == 0) + { + Logger::instance().log(" WARNING! Zero size ",LogLevel::ERROR); + return; + } - stream << packetType; //Отправляем тип блока - stream << fileSize; - stream << array; + stream << packetType; //Отправляем тип блока + stream << size; + + while (size > 0) + { + QByteArray chunk = array.mid(bytesSended,sendFileBlockSize); + stream << chunk; + + bytesSended += chunk.length(); + size -= bytesSended; + } } else { - sendPacketType(packetType); - QByteArray message; - int size = array.length(); - message.append(reinterpret_cast(&size), sizeof(int)); - socket->write(message); - socket->write(array); + sendPacketType(packetType); + quint64 size = array.size(); + qint64 bytesSended = 0; + + if (size == 0) + { + Logger::instance().log(" WARNING! Zero size ",LogLevel::ERROR); + return; + } + + QByteArray message; + message.append(reinterpret_cast(&size), sizeof(int)); + socket->write(message); + + while (size > 0) + { + QByteArray chunk = array.mid(bytesSended,sendFileBlockSize); + quint64 bytesSended = socket->write(chunk); + + size -= bytesSended; + } + } - - } void SendSystem::sendVersion() @@ -148,7 +199,7 @@ void SendSystem::sendFileBlockWithRename(QString path, QString newName) if(file.open(QFile::ReadOnly)){ while(!file.atEnd()){ - QByteArray data = file.read(1025*250); + QByteArray data = file.read(sendFileBlockSize); stream << data; socket->waitForBytesWritten(); countSend++; diff --git a/ServerLMS/Systems/tools.h b/ServerLMS/Systems/tools.h index f25ebff..35dd84c 100644 --- a/ServerLMS/Systems/tools.h +++ b/ServerLMS/Systems/tools.h @@ -50,6 +50,11 @@ static const QString commandUpdateFilesClient = "update"; static const QString commandGetTasks = "GETTASKS"; static const QString commandeGetOfflineMessages = "GETOFFLINEMESSAGE"; +//static quint64 fileBlockSize = 1460; +static quint64 sendFileBlockSize = 256000; +static quint64 readFileBlockSize = 65535; +//1025*250 + class Tools { public: static void printTime();