Пустой буфер при чтении из 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;