QTcpServerとシンプルなサーバーがあり、QNetworkAccessManagerの単純なサーバーがあります。私はQNetworkAccessManagerのすべてを介して、任意のサイトからのデータを要求するとQNetworkAccessManagerとQTcpServerを使用する場合
- 私はカールまたはブラウザのすべてを介してサーバからデータを要求
- okです
- OKですしかし、私はQNetworkAccessManager経由QTcpServerからデータを読み取ることができません。すべての要求がリセットされます。 QNetworkAccessManager(クライアント)は、サーバーからデータを受信した直後にRST(リセット接続)を送信しました。クライアントコードでは、 "Connection closed"(RemoteHostClosedError)
- また、DownloadManagerの例のQNetworkAccessManagerとFortuneServerのQTcpServerの例をさまざまな組み合わせで試してみましたが、結果は同じでした。
テスト済みのQtバージョン:
- マックの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空行がheader-及びコンテンツセクション 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