我正在创建一个简单的 TCP 服务器,并构建了一个槽/函数,用于读取来自 TCP 套接字上的客户端(telnet 连接)的传入文本。我使用了《财富》代码示例来帮助我,但不得不删除 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 是正确的选择吗?有人可以提供一个简单的替代方案来替代我想要实现的目标吗?
最佳答案
您可以简单地使用 readLine(...) 变体:
qint64 QIODevice::readLine(char * data, qint64 maxSize)
QByteArray QIODevice::readLine(qint64 maxSize = 0)
请注意,读取行功能将在您的 QTcpSocket 实例上调用,而不是在 QDataStream 上调用。有关详细信息,请参阅内联文档:
A terminating '\0' byte is always appended to data, so maxSize must be larger than 1. Data is read until either of the following conditions are met: The first '\n' character is read. maxSize - 1 bytes are read. The end of the device data is detected.
这样,您就需要解决这样的问题,并且代码可能会变得更加简单。
还有一个可能有帮助的注释:
bool QIODevice::canReadLine() const [virtual]
基本上,此方法将保证您不会尝试在可用之前运行线路。这在某些情况下可以派上用场。
关于c++ - 使用 QDataStream 或 QTextStream 或两者都不从 tcpsocket 读取文本行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19061252/