[英]How do I read a class object from a QTcpSocket using a QDataStream?
我有一個由我定義的類,例如MyClass
。 我想通過QTcpSocket
發送此類的對象。 該答案建議使用QDataStream
, 這表明如何可以重載<<
和>>
運算符以實現此目的。
到目前為止,我已經設法為QDataStream
重載<<
和>>
運算符。 對於發送和接收部分,我遵循的是Marek R的 回答 ,該回答回答的問題或多或少是該問題的重復。 發送MyClass
對象的服務器代碼似乎正常工作。 但是,我無法弄清楚如何從QDataStream
接收和格式化數據。
void SomeClass::slotReadClient() { // slot connected to readyRead signal of QTcpSocket
QTcpSocket *tcpSocket = (QTcpSocket*)sender();
QDataStream clientReadStream(tcpSocket);
while(true) {
if (!next_block_size) {
if (tcpSocket->bytesAvailable() < sizeof(quint16)) { // are size data available
break;
}
clientReadStream >> next_block_size;
}
if (tcpSocket->bytesAvailable() < next_block_size) {
break;
}
QString str;
clientReadStream >> str;
next_block_size = 0;
}
}
但是,當我使用它時,出現錯誤:
error: no matching function for call to ‘QDataStream::QDataStream(QTcpSocket*&, QIODevice::OpenModeFlag)’
根據發送方法,我嘗試如下:
MyClass obj;
QByteArray block;
QDataStream rs(&block,QIODevice::ReadWrite);
rs.setVersion(QDataStream::Qt_5_7);
int nextblocksize = 0;
while(true)
{
if(!nextblocksize)
{
if(socket->bytesAvailable() < sizeof(quint16))
{
break;
}
socket->read(block,socket->bytesAvailable());
rs>>nextblocksize;
}
if(socket->bytesAvailable() < nextblocksize)
{
break;
}
socket->read(block,socket->bytesAvailable());
rs>>obj;
nextblocksize=0;
}
但是,這產生以下錯誤:
error: conversion from ‘QByteArray’ to ‘char*’ is ambiguous
socket->read(block,socket->bytesAvailable());
^
作為參考,以下是用於發送的代碼,該代碼可以成功編譯(在讀取代碼工作之前,無法檢查):
QTcpSocket *socket = server->nextPendingConnection();
QByteArray block;
MyClass obj(1,2.0, "Hi\n");
QDataStream ds(&block,QIODevice::ReadWrite);
ds.setVersion(QDataStream::Qt_5_7);
ds<<quint16(0)<<obj;
socket->write(block);
我對網絡概念不是很熟悉,所以我可能缺少一些瑣碎的東西。
我該怎么做呢?
另外,在塊的開頭發送的quint16(0)
的意義是什么? 據稱它可以作為塊大小的指標,但是它是如何做到的呢? 不管塊大小是多少,都是一樣的嗎? 還是我完全誤解了它的用法?
謝謝。
如果MyClass實現了QJsonObject serializeToJson() and void deserializeFromJson(const QJsonObject&)
,則可以發送類的json表示形式。 我認為這樣會更簡單。
class Serializable
{
public:
Serializable(){}
virtual ~Serializable(){}
virtual QJsonObject serialize_to_json() = 0;
};
class Deserializable
{
public:
Deserializable(){}
virtual ~Deserializable(){}
virtual void deserialize_from_json(const QJsonObject&) = 0;
};
// MyClass implements Serializable and Deserializable
MyClass obj;
// To wrire
// construct QJsonDocument from serializeToJson
// write bytes representing the json
// QJsonDocument::toJson() returns QByteArray
socket->write(QJsonDocument(obj.serializeToJson()).toJson());
// To read
// Construct QJsonDocument from received bytes
// QJsonDocument::fromJson(bytes).toObject returns QJsonObject
MyClass obj;
obj.deserializeFromJson(QJsonDocument::fromJson(socket->readAll()).toObject());
我省略了json檢查部分。 解析json
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.