0
我有簡單的服務器與QTcpServer和簡單的客戶端與QNetworkAccessManager。「連接關閉」當使用QNetworkAccessManager和QTcpServer
- 當我通過捲曲或瀏覽器的所有服務器請求數據。當我請求任何網站資料,透過QNetworkAccessManager一切正常
- 但我無法通過QNetworkAccessManager讀取QTcpServer既可數據是確定
- 。所有請求都已重置。 QNetworkAccessManager(客戶端)在從服務器接收到數據後立即發送RST(重置連接)。而在客戶端代碼中,我們得到了錯誤:「連接已關閉」(RemoteHostClosedError)
- 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)
是的,你是對的!感謝您的答覆! – Ildar
我要感謝[Qt Forum](https://forum.qt.io)上的raven-worx對他的回覆: – Ildar
他的回覆: 至少響應應該如下所示。 注: 每一行應與\ 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