Читать текстовые строки, используя QDataStream или QTextStream или ни один из tcpsocket?

Я создаю простой TCP-сервер, и у меня есть встроенный слот / функция, которая читает входящий текст от клиента (соединение telnet) через сокет TCP. Я использовал примеры кода Fortune, чтобы помочь мне, но мне пришлось удалить QDataStream, так как он работал не так, как ожидалось.

Я хочу, чтобы моя функция readCommand собирала входящие символы из соединения с клиентом telnet, и как только она находит новую строку или возвращает, чтобы удалить набранную команду из буфера ввода, удалите / n и / r, добавьте ее в мой список строк (commandList), а затем повторить команды (отдельная функция). Вот что у меня так далеко:

void MyServer::readCommand()
{
inBuffer += tcpSocketPtr->readAll();

// While newline is present, extract the command
int nextNewlinePos;
while ((nextNewlinePos = inBuffer.indexOf('\n')) > -1) {
commandList << inBuffer.left(nextNewlinePos);
inBuffer.remove(0,nextNewlinePos);
// Get rid of /n /r if present somehow
}
if (commandList.size() > 0)
{
echoCommand();
}
}

Прежде чем я начну извлекать / n и / r и т. Д. Вручную, моя интуиция говорит мне, что есть лучший способ сделать это. QTextStream — это путь? Может ли кто-то предоставить простую (r) альтернативу тому, чего я пытаюсь достичь?

1

Решение

Вы можете просто использовать варианты readLine (…):

  • qint64 QIODevice :: readLine (char * data, qint64 maxSize)

  • QByteArray QIODevice :: readLine (qint64 maxSize = 0)

Обратите внимание, что функция чтения строки будет вызываться в вашем экземпляре QTcpSocket, а не в QDataStream. Точную информацию смотрите в документации:

Завершающий байт ‘\ 0’ всегда добавляется к данным, поэтому maxSize должен быть
больше 1. Данные считываются до тех пор, пока не будет выполнено одно из следующих условий
встречаются: первый символ ‘\ n’ читается. maxSize — 1 байт считывается.
Конец данных устройства обнаружен.

Таким образом, вам нужно будет обойти эту проблему, и код может стать намного проще.

Еще одно замечание, которое может быть полезным:

bool QIODevice::canReadLine() const [virtual]

По сути, этот метод гарантирует, что вы не будете пытаться запустить строку до того, как она станет доступной. Это может пригодиться в определенных сценариях.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]