簡體   English   中英

如何使用QDataStream從QTcpSocket讀取類對象?

[英]How do I read a class object from a QTcpSocket using a QDataStream?

我有一個由我定義的類,例如MyClass 我想通過QTcpSocket發送此類的對象。 該答案建議使用QDataStream表明如何可以重載<<>>運算符以實現此目的。

到目前為止,我已經設法為QDataStream重載<<>>運算符。 對於發送和接收部分,我遵循的是Marek R的 回答 ,該回答回答的問題或多或少是該問題的重復。 發送MyClass對象的服務器代碼似乎正常工作。 但是,我無法弄清楚如何從QDataStream接收和格式化數據。

根據Marek R的 回答

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM