2.7 KiB
Отправка сообщений QT сервер: Отправка маленьких XML пакетов без информации о размере. TYPE_XMLANSWER
void SendSystem::sendXmlAnswer(QByteArray array, PacketType packetType)
{
qDebug() << "SendSystemThread: " << QThread::currentThreadId();
Logger::instance().log("C: " + client->getLogin() + " send pack " + enumToString(packetType) +
" " + QString::fromUtf8(array),LogLevel::DEBUG);
if (client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT ||
client->getClientType() == TypeClientAutorization::TYPE_GUI)
{
// для QT
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
stream << packetType;
stream << array;
socket->waitForBytesWritten();
}
else
{ // для Unity
sendPacketType(packetType);
QByteArray message;
int size = array.length();
message.append(reinterpret_cast<char*>(&size), sizeof(int));
socket->write(message);
socket->write(array);
}
}
Отправка пакета без вложения:
void SendSystem::sendPacketType(PacketType packetType){ if (client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT || client->getClientType() == TypeClientAutorization::TYPE_GUI) { //Для QT QDataStream stream(socket); stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); stream << packetType; socket->waitForReadyRead(100); } else { //для Unity QByteArray message; int type = (int)packetType; message.append(reinterpret_cast<char*>(&type), sizeof(int)); socket->write(message); } }
Не подходит для последнего сообщения (например при отключении клиента)
Отправка сервисного сообщения (тип ServerNotify)
void SendSystem::sendNotify(QString notify) { qDebug() << "SendNotify thread: " << QThread::currentThreadId(); auto answer = emit sigSendNotify(notify); sendXmlAnswer(answer); }
Типы сообщений QT->Unity: TYPE_XMLANSWER Остальные QT->QT
Сообщение порядок приема данных QDataStream:
- размер сообщения(отсылается неявно)
- само сообщение в бинарном формате(в нашем случае XML)
UNITY: при переходе на новую систему общения пакетами нужно: отправлять пакет о типе XML ответа при каждой отправке