0

我试图修改Qt网络教程,并像这样实现它:

quint16 blockSize;

void Client::readData()
{
    qDebug() << "Received Data!";
    QByteArray data;

    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;

        in >> blockSize;
    }

    qDebug() << "Received DATA II with blocksize " << blockSize;
    if (tcpSocket->bytesAvailable() < blockSize)
    {
        qDebug() << tcpSocket->bytesAvailable() << ' ' << blockSize;
        return;
    }
    qDebug() << "Received DATA III";
    in >> data;
    qDebug() << data;
    QByteArray dbg = data;   // create a copy to not alter the buffer itself
    dbg.replace('\\', "\\\\"); // escape the backslash itself
    dbg.replace('\0', "\\0");  // get rid of 0 characters
    dbg.replace('\n', "\\n");
    //dbg.replace('"', "\\\"");  // more special characters as you like
    qDebug() << dbg;
    QString data_string(data);
    qDebug() << "Emitting Signal";
    emit Client::gotData(data_string);

}

void Server::sendData(void)
{
        QByteArray block;
        QDataStream out(&block, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_0);
        out << (quint16)0;
        out << "Hello World, this is a very long text!";
        out.device()->seek(0);
        out << (quint16)(block.size() - sizeof(quint16));
        qDebug() << "First number is: " << (quint16)(block.size() - sizeof(quint16));
        qDebug() << "Blocksize is: " << block.size() << "with quint size: " << sizeof(quint16);

        qDebug() << "Sending data!";
        //Debug
        QByteArray dbg = block;   // create a copy to not alter the buffer itself
        dbg.replace('\\', "\\\\"); // escape the backslash itself
        dbg.replace('\0', "\\0");  // get rid of 0 characters
        dbg.replace('\n', "\\n");
        //dbg.replace('"', "\\\"");  // more special characters as you like
        qDebug() << dbg;
        connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
        clientConnection->write(block);
        //clientConnection->disconnectFromHost();
}

连接工作正常,但是当我调用时sendData(),我(从同一个函数)得到传输块:

First number is:  43
Blocksize is:  45 with quint size:  2
Sending data!
"\0+\0\0\0'Hello World, this is a very long text!\0"

我的第一个问题是:所有这些\0来自哪里?据我了解代码,首先我创建一个0,然后我编写文本,然后我将回到前面并编写块的完整大小。是因为大小(quint16)吗?当不输入任何内容时,我得到\0\0的大小为 0,这是正确的。上面示例的大小是 43,对应+于 ascii(这个符号也在上面的块中)。
我的第二个问题是:我的readData()-function 无法识别块大小(它总是返回 450 作为块大小,这显然是错误的)。为什么?我错过了什么?
更新:更改QByteArray data;QString data;我的问题后,我的代码不再奇怪\0->应该使用正确的数据类型->头->书桌

4

0 回答 0