2017-02-27 18 views
0

나는 나를 정의한 클래스, 예를 들어 MyClass을 가지고 있습니다. 이 클래스의 객체를 QTcpSocket으로 보내고 싶습니다. This answerQDataStream을 사용하고 있으며 this<<>> 연산자를 어떻게 오버로드하여이를 수행 할 수 있는지 보여줍니다.QDataStream을 사용하여 QTcpSocket에서 클래스 객체를 읽으려면 어떻게해야합니까?

QDataStream에 대해 <<>> 연산자를 오버로드 할 수있었습니다. 송수신 부분에 대해서는 this answer에서 Marek R으로 지시를 따르고 있습니다.이 질문은 다소 중복 된 질문에 대한 답변입니다. MyClass 개체를 보내는 내 서버 코드가 작동하는 것 같습니다. 그러나 QDataStream에서 데이터를 받고 형식을 지정하는 방법을 알 수 없습니다. 다음과 같이 전송하는 방법에 따라

error: no matching function for call to ‘QDataStream::QDataStream(QTcpSocket*&, QIODevice::OpenModeFlag)’ 

, 내가 시도 : :이 사용할 때 Marek R'sanswer에서

, 그러나

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; 
    } 
} 

, 오류가 발생합니다

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; 
    } 

그러나이 오류는 다음과 같습니다.

,

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); 

내가 네트워킹 개념에 익숙하지 않다 : 참고로

error: conversion from ‘QByteArray’ to ‘char*’ is ambiguous 
      socket->read(block,socket->bytesAvailable()); 
                 ^

다음은 (노력하고 독서에 대한 코드까지 검사 할 수 없습니다) 성공적으로 컴파일 보내기위한 코드입니다 그래서 나는 사소한 것을 놓칠지도 모른다.

어떻게하면됩니까?

또한 블록 시작 부분에 보낸 quint16(0)의 의미는 무엇입니까? 그것은 그것이 블록의 크기의 지시자 역할을한다고 주장되지만, 어떻게 이것을 하는가? 블록 크기가 무엇인지에 상관없이 동일하지 않습니까? 아니면 그 사용법을 완전히 오해 했습니까?

감사합니다.

+0

왜 serializeToJson 및 deserializeFromJson 함수를 작성하지 않습니까? 그것은 더 간단 할 것이다. –

+0

@MherDidaryan 나는이 방법으로 만 문자열을 보낼 수 있다고 생각했습니다. 예를 들어 주시겠습니까? – GoodDeeds

+0

예 (QByteArray) 바이트를 보냅니다. QJsonDocument에는 QByteArray를 반환하는 toJson 메서드가 있습니다. –

답변

-1

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 확인 부분을 생략했습니다. parsing json

+0

감사합니다. 'serializeToJson()'과'deserializeFromJson()'을 어떻게 구현합니까? 게다가 클래스에 포인터 타입이 있다면 어떻게 될까? 이 방법으로 처리 할 수 ​​있습니까? – GoodDeeds

+0

QJsonObject에는 삽입 기능이 있습니다. jsonObj.insert ("name", this-> getName()); 포인터 유형은 또한 Serializable 인터페이스를 구현할 수 있습니다. –