使用QDataStream或QTextStream读取文本行,还是从tcpsocket读取文本行?

时间:2013-09-27 22:46:08

标签: c++ qt qtcore qtnetwork qiodevice

我正在创建一个简单的TCP服务器,并且内置了一个插槽/函数,用于从TCP套接字上的客户端(telnet连接)读取传入文本。我使用了Fortune代码示例来帮助我,但由于它没有按预期工作,因此不得不删除QDataStream。

我希望我的readCommand函数从telnet客户端连接收集传入的字符,一旦找到换行符或返回从输入缓冲区中删除typed命令,删除/ 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 个答案:

答案 0 :(得分: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]

基本上,这种方法可以保证在可用之前不要尝试运行一行。这在某些情况下会派上用场。