我正在创建一个简单的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)替代我想要实现的目标吗?
答案 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]
基本上,这种方法可以保证在可用之前不要尝试运行一行。这在某些情况下会派上用场。