Проблема здесь в том, что socket->write()
является операцией относительно низкого уровня, которая является частью QIODevice
API. не будет разбивать все ваши данные на более мелкие куски размером <8192 байта, чтобы соответствовать требованиям протокола TCP. </p>
Надеемся, вы можете использовать QDataStream
для отправки / получения данных безболезненно, бездумать о реализации протокола:
//send data
QDataStream sender(socket);
QByteArray dataWhichMightBeBiggerThan8192Bytes = jsonRequest.toLatin1();
sender << dataWhichMightBeBiggerThan8192Bytes;
Чтобы получить данные:
//connect your socket
QObject::connect(
socket, &QIODevice::readyRead,
this, &mywindow::_processIncomingData
);
Затем в вашем классе:
//Is called every time new data is sent to the socket
void mywindow::_processIncomingData() {
//prepare to receive data
QDataStream receiver(this->_innerSocket);
//will loop until the whole waitingBytes of the socket are exhausted
while(!receiver.atEnd()) {
//start a transaction, so the waitingBytes of the socket can be automatically reset if not all the expected data is there
receiver.startTransaction();
//push waitingBytes into a QByteArray
QByteArray myJsonAsLatin1;
receiver >> myJsonAsLatin1;
//commit : if it failed, means data is missing, so you may keep looping while the client downloads more
if(auto commitFailed = !receiver.commitTransaction()) continue;
//commit succeeded, waitingBytes are freed from your QByteArray, you can now process your data
this->_useMyData(myJsonAsLatin1);
}
}