Пустой буфер при чтении из QTcpSocket

Я создаю простой многопоточный TCP-сервер (на примере многопоточного сервера Fortune). Я подключил сигнал readyRead к своему слоту readCommand и подтвердил, что функция readCommand срабатывает после того, как я подключился к серверу и отправил строку (после ввода).

Приведенная ниже функция выводит "In readCommand", как только я отправляю строку "HELLO", тогда вывод "new inBuffer" всегда показывает пустой ("").

void FortuneThread::readCommand()
{
    qDebug() << "in readCommand" << endl;
    QDataStream in(tcpSocketPtr);
    in.setVersion(QDataStream::Qt_4_0);
    in >> inBuffer;
    qDebug() << "new inBuffer: " << inBuffer << endl;
    ...
}

Если я распечатываю tcpSocket->bytesAvailable(), то я вижу растущее число символов, когда я отправляю больше через telnet. Я просто не получаю их из сокета... приведенный выше код скопирован из примера клиента Fortune, поэтому я предположил, что он будет работать. Я использую QDataStream неправильно?

2 ответа

Решение
  • Вы не должны инициализировать свой QDataStream с помощью QTcpSocket.

  • Вы должны прочитать данные с устройства Socket IO с QByteArray QIODevice::readAll(),

  • Вы должны записать байтовый массив предыдущей операции в поток данных с помощью оператора "<<".

Итак, код должен выглядеть примерно так:

void FortuneThread::readCommand()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out << tcpSocketPtr->readAll();
    ...
}

Коды, подобные этим, будут работать:

QByteArray res;
res.reserve(m_tcp_socket_ptr->bytesAvailable());
res = m_tcp_socket_ptr->readAll();

qDebug() << res;
Другие вопросы по тегам