我有一个由我定义的类,比如说MyClass
。我想通过QTcpSocket
. 这个答案建议使用 a QDataStream
,这显示了如何重载<<
and>>
运算符来实现这一点。
到目前为止,我已经<<
设法>>
为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)
在块的开头发送的意义是什么?据称它可以作为块大小的指标,但它是如何做到的呢?无论块大小是多少,它都不是一样的吗?还是我完全误解了它的用法?
谢谢你。