2016-10-20 75 views
0

我有簡單的服務器與QTcpServer和簡單的客戶端與QNetworkAccessManager「連接關閉」當使用QNetworkAccessManager和QTcpServer

  1. 當我通過捲曲或瀏覽器的所有服務器請求數據。當我請求任何網站資料,透過QNetworkAccessManager一切正常
  2. 但我無法通過QNetworkAccessManager讀取QTcpServer既可數據是確定
  3. 。所有請求都已重置。 QNetworkAccessManager(客戶端)在從服務器接收到數據後立即發送RST(重置連接)。而在客戶端代碼中,我們得到了錯誤:「連接已關閉」(RemoteHostClosedError
  4. ASLO,我嘗試使用QNetworkAccessManager從下載管理器例如從FortuneServer例如,在各種組合QTcpServer既可,但結果是一樣的。

測試的Qt版本:

  • 的Mac的Qt 5.7
  • 的Linux的Qt 5.7
  • 的Linux的Qt 5.6.2
  • 的Linux的Qt 5.5.1

Wireshark的截圖: qt-wireshark.png
上部(帶紅色林ES)是QNetworkAccessManager的結果,併成功結果的最新數據包捲曲試圖從QTcpServer既可

獲取數據

也有一個簡單的例子來重現錯誤:testNetwork.zip

這裏是客戶端的代碼示例:

void test(quint16 port) 
{ 
    QNetworkAccessManager *manager = new QNetworkAccessManager(); 

    QNetworkRequest request; 
    request.setUrl(QUrl(QString("http://127.0.0.1:%1/").arg(port))); 

    manager->connect(manager, &QNetworkAccessManager::finished, 
        [](QNetworkReply *reply) { 
     qDebug() << QString("Finished. %1. %2").arg(reply->errorString()).arg(reply->error()); 
     qDebug() << "readed: " << reply->readAll(); 
    }); 

    QNetworkReply *reply = manager->get(request); 

    reply->connect(reply, &QNetworkReply::readyRead, [reply]() { 
     qDebug() << QString("readyRead: '%1'").arg(QString(reply->readAll())); 
    }); 
} 

和服務器:

QTcpSocket socket; 
... 
if(socket.waitForReadyRead(5000)) 
{ 
    QByteArray request; 
    request += socket.readAll(); 

    QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!"); 

    socket.write(responce); 
    if(!socket.waitForBytesWritten()) 
    { 
     qWarning() << QString("Error occurred in waitForBytesWritten() method of the tcp socket. %1 (%2)") 
         .arg(socket.errorString()) 
         .arg(socket.error()); 
    } 
} 
else 
{ 
    qWarning() << QString("Error occurred in read method of the tcp socket. %1 (%2)") 
        .arg(socket.errorString()) 
        .arg(socket.error()); 
} 

而且我在qt.io創建了一個錯誤報告(QTBUG-56631)

回答

0

您的客戶端正在發出HTTP請求,但您的服務器不是http服務器 - 它不會發回有效的HTTP請求。

當您將它指向Web服務器時,您的客戶端會工作,因爲它是一個http服務器。

QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!"); 

不是有效的HTTP響應。

+0

是的,你是對的!感謝您的答覆! – Ildar

+0

我要感謝[Qt Forum](https://forum.qt.io)上的raven-worx對他的回覆: – Ildar

+0

他的回覆: 至少響應應該如下所示。 注: 每一行應與\ r \ n 一個空行的報頭 - 和內容部分 Content-Length頭部分離結束是內容 HTTP/1的字節數。1個200 OK 日期:週四,2016年10月20日12時28分53秒GMT 服務器:MyServer的1.0.0 的Content-Length:3 的Content-Type:text/plain的 連接:關閉 XXX – Ildar