我正在写一个简单的网络应用程序。客户端发送到服务器消息服务器在QTextEdit中打印并响应客户端。 我正在使用QTcpServer和QTcpSocket。 存在一个我无法解决的问题。接收数据是quint16 + QTime + QString作为QByteArrey发送。 我使用quint16来接收数据块的大小。出于某种原因,当客户机向服务器发送为什么QTcpSocket收到错误的数据?
next block size: 16 (quint16 value)
block size: 18
服务器获得:
next block size: 30073 (quint16 value)
block size: 18
正如你所看到的,由于某种原因,服务器从QDataStrem错误的变量值获得,它始终是30073.我不不明白为什么?
void Widget::slotSendToServer()
{
logTextEdit->append("slotSendToServer()");
QByteArray arrBlock;
QDataStream serverSendStream(&arrBlock, QIODevice::ReadWrite);
QString messageStr = messageLineEdit->text();
serverSendStream << quint16(0) << QTime::currentTime()
<< messageStr;
serverSendStream.device()->seek(0);
serverSendStream << (quint16)(arrBlock.size() - sizeof(quint16));
qDebug() << "next_block_size:"
<<(quint16)(arrBlock.size() - sizeof(quint16))
<< endl
<< "full size of Byte arrey:" << arrBlock.size();
tcpSocket->write(arrBlock);
messageLineEdit->clear();
}
void Widget::slotReadClient()
{
logTextEdit->append("slotReadClient()");
QTcpSocket *tcpSocket = (QTcpSocket*)sender();
QDataStream clientReadStream(tcpSocket);
while(true)
{
if (!next_block_size)
{
if (tcpSocket->bytesAvailable() < sizeof(quint16))
{
break;
}
clientReadStream >> next_block_size;
}
if (tcpSocket->bytesAvailable() < next_block_size)
{
break;
}
QTime time;
QString messageTextStr;
clientReadStream >> time >> messageTextStr;
QString messageCompleteStr =
time.toString() + " " + "Client has sent - "
+ messageTextStr;
logTextEdit->append("Message received: ");
logTextEdit->append(messageCompleteStr);
next_block_size = 0;
sendToClient(tcpSocket,
"Server Response: Received \""
+ messageTextStr + "\"");
}
}
TL; DR!请缩小范围并只发布相关代码。 –
@Joachim Pileborg完成。 –
你可以尝试的两件事:代替使用流和流操作符,可以尝试使用套接字函数来编写/读取(比如['write'](http://qt-project.org/doc/qt-5.0/) qtcore/qiodevice.html#write)和['read'](http://qt-project.org/doc/qt-5.0/qtcore/qiodevice.html#read))。第二件事是尝试检查发送方和接收方的字节顺序,它们是否一样? –