[英]Read text lines using QDataStream or QTextStream or neither from tcpsocket?
我正在創建一個簡單的TCP服務器,並具有一個插槽/功能,該插槽/功能可以從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是要走的路嗎? 有人可以提供我想要實現的簡單替代方法嗎?
您可以簡單地使用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]
基本上,此方法將保證您在可用之前不會嘗試運行一行。 在某些情況下這可以派上用場。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.