簡體   English   中英

使用QDataStream或QTextStream或從tcpsocket都不讀取文本行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM