0

私は単純なネットワークアプリケーションを書いています。クライアントがサーバー メッセージ 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 + "\"");
    }
}
4

2 に答える 2

2

next_block_sizeソケットが接続されるたびに、変数が 0 に初期化されていることを確認する必要があります。

QTcpSocket同じオブジェクトを再利用しない場合、これはWidgetクラス コンストラクターで実行できます。再利用する場合は、 signal に接続されたスロットで実行できますconnected()

于 2013-06-30T12:47:34.090 に答える