[英]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.