나는 나를 정의한 클래스, 예를 들어 MyClass
을 가지고 있습니다. 이 클래스의 객체를 QTcpSocket
으로 보내고 싶습니다. This answer은 QDataStream
을 사용하고 있으며 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)
의 의미는 무엇입니까? 그것은 그것이 블록의 크기의 지시자 역할을한다고 주장되지만, 어떻게 이것을 하는가? 블록 크기가 무엇인지에 상관없이 동일하지 않습니까? 아니면 그 사용법을 완전히 오해 했습니까?
감사합니다.
왜 serializeToJson 및 deserializeFromJson 함수를 작성하지 않습니까? 그것은 더 간단 할 것이다. –
@MherDidaryan 나는이 방법으로 만 문자열을 보낼 수 있다고 생각했습니다. 예를 들어 주시겠습니까? – GoodDeeds
예 (QByteArray) 바이트를 보냅니다. QJsonDocument에는 QByteArray를 반환하는 toJson 메서드가 있습니다. –