Читать текстовые строки с помощью 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) альтернативу тому, чего я пытаюсь достичь?


person TSG    schedule 27.09.2013    source источник


Ответы (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]

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

person lpapp    schedule 27.09.2013