私は単純なネットワークアプリケーションを書いています。クライアントがサーバー メッセージ server に送信し、QTextEdit でそれを印刷して client に応答します。QTcpServer と QTcpSocket を使用しています。私には解決できない問題があります。受信データは quint16 + QTime + QString で、QByteArrey として送信されます。データブロックのサイズを受け取るために quint16 を使用します。そして何らかの理由で、クライアントがサーバーに送信するとき
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 + "\"");
}
}