您需要定義comman數據類型兩側(客戶端一個美麗的方式和服務器)。在發送數據包之前,您應該將數據包的大小寫入數據包的前四個字節。在服務器端檢查從前四個字節的客戶端接收數據的大小。並反序列化你在客戶端如何序列化的數據。我長時間使用這種方法,並且今天出現了任何問題。我會爲你提供示例代碼。
客戶端:
QBuffer buffer;
buffer.open(QIODevice::ReadWrite);
QDataStream in(&buffer);
in.setVersion(QDataStream::Qt_5_2);
in << int(0); // for packet size
in << int(3); // int may be this your data type or command
in << double(4); // double data
in << QString("asdsdffdggfh"); //
in << QVariant("");
in << .... // any data you can serialize which QDatastream accept
in.device()->seek(0); // seek packet fisrt byte
in << buffer.data().size(); // and write packet size
array = buffer.data();
this->socket->write(arr);
this->socket->waitForBytesWritten();
服務器端:
QDatastream in(socket);
//define this out of this scope and globally
int expectedByte = -1;
if(expectedByte < socket->bytesAvailable() && expectedByte == -1)
{
in >> expectedByte;
}
if(expectedByte - socket->bytesAvailable()- (int)sizeof(int) != 0){
return;
}
// if code here, your packet received completely
int commandOrDataType;
in >> commandOrDataType;
double anyDoubleValue;
in >> anyDoubleValue;
QString anyStringValue;
in >> anyStringValue;
QVariant anyVariant;
in >> anyVariant;
// and whatever ...
// do something with above data
//you must set expectedByte = -1;
// if your proccessing doing any thing at this time there is no any data will be received while expectedByte != -1, but may be socket buffer will be filling. you should comfirm at the begining of this function
expectedByte = -1;
希望這會很有幫助! :)
我不太確定你的問題是什麼,但在我看來,你似乎在設計*協議*。即某種方式說「此消息包含此數據」和「此其他消息包含其他數據」。 –
您的服務器和客戶端需要知道如何通信。也就是說,他們必須就一個通用的協議達成一致 - 比如「我總是會發送兩個字節來識別將要發生的事情的類型,然後我會發送4個字節來表示'事情'的大小,然後數據將會跟隨」;那麼你會回覆「我們已經同意的形式的東西」等 - 或類似的東西..你不能只是發送任意的「東西」,並期望另一端猜測它是什麼。 –
@JesperJuhl所以協議只是關於數據如何識別的規則和描述的集合? –