問題タブ [qnetworkreply]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - QNetworkReply は常に finished() を出力しますか?
シグナル finished() のドキュメントを読みましたが、 finished() が常に発行されるとは言いません。そして、error() シグナルを読み取りました。
void QNetworkReply::error(QNetworkReply::NetworkError code) このシグナルは、応答が処理中にエラーを検出したときに発行されます。接続が終了したことを示す finished() シグナルがおそらく続きます。
code パラメータには、検出されたエラーのコードが含まれます。errorString() を呼び出して、エラー状態のテキスト表現を取得します。
注: この信号に接続されているスロット内のオブジェクトを削除しないでください。deleteLater() を使用します。
error() および errorString() も参照してください。
この行The finished() signal will probably follow
は、特定の条件下で QNetworkReply が finished() を発行しないことを意味していますか?
qt - Qt、QNetworkAccess Manager の大きなファイルのダウンロードが頻繁に失敗する
次のコードを使用して、LAN 経由でいくつかのビデオ ファイルをダウンロードしています。
ただし、ダウンロードは頻繁に失敗します。応答終了シグナルがトリガーされると、実際にはファイルのダウンロードは終了せず、ファイルの一部のみがダウンロードされます。これに対処するにはどうすればよいですか?
c++ - QNetworkAccessManager と QNetworkReply でネットワーク障害をシミュレートする
Qt4.8 を使用していますが、QNetworkAccessManager を使用する既存のコードにネットワーク障害を挿入したいと考えています。ただし、このクラス、特に関連する QNetworkReply には奇妙なセマンティクスがあるようです。QNetworkAccessManager のサブクラスと QNetworkReply のサブクラスを作成しました。私の QTestNetworkAccessManager は、ベース QNetworkAccessManager によって作成されたオブジェクト、またはリスト内の次のテスト応答のいずれかを返します。
単一のリクエストという単純で些細なケースでは、私のテスト コードは機能しているように見えますが、大量のネットワーク トラフィックを処理するより大きなアプリにコードを配置すると、2 つの問題が発生します。
まず、QNetworkAccessManager は、作成している QNetworkReply オブジェクトのプライベートな知識を持っているようです。(Qtソースの検査に基づく)。たとえば、さまざまなフレーバーの QHttpReplyImpl やその他のさまざまな Impl オブジェクトを作成し、それらをさまざまな方法で接続するため、私のテスト オブジェクトはその環境では適切な市民ではないようです。これにより、error() シグナルが正しく伝搬されず、メモリ空間でスタックが破損するなどの問題が発生するようです。
(QTextNetworkReply オブジェクト全体を投稿しているわけではありません。これは非常に単純であり、私の質問は特定のコードのトラブルシューティングではないためです。)
私の質問は、QNetworkAccessManager でこの種の障害注入を行って、さまざまな HTTP 障害をシミュレートできた人はいますか?
1 つ考えられたのは、HttpProxy フックを使用して、実際にソケット レベルでデータを注入するプロキシ サーバーを作成し、QHttp* オブジェクト パーサー全体をトラバースすることでしたが、それはかなり面倒に思えます。
QNetworkAccessManager に障害を挿入して、ライブ サーバーと通信しているように振る舞う簡単な方法はありませんか?
ありがとう!
PS私はhttps://blogs.kde.org/2010/08/28/implementing-reusable-custom-qnetworkreplyに精通しているため、QNAMをサブクラス化する道をたどりましたが、そうではないようですエラーのセマンティクスを正しく処理し、コードへの厄介なリンクが壊れています。
c++ - QNetworkReply で取得した html テーブルへのアクセス
http://finance.yahoo.com/exchangesにある表のサフィックス列を読みたいです。
でページを読みましたQNetworkManager
。にデータを保存しますQNetworkReply *reply
。ですべてのページを読み取ると、ページがreply->readAll()
取得されるため、正しく取得されます。内部に設定し、内部にあるQWebPage
すべてのテーブルを取得したいと考えています。
使用したいテーブルを取得するために、QWebElement
それを読み取ることができません。必要なテーブルと同じレベルのすべてのテーブルを読み取りましたが、QWebElementCollection
取得したテーブルは空です。
私が間違っていることと、テーブルを読むためにしなければならないことは何ですか?
qt - QT 5.5 - QNetworkReply の空のデータ
私はすでに他の質問に答えましたが、答えが見つかりませんでした。でダウンロードした HTML コードを印刷する際に問題がありますQNetworkAccessManager
。
このコードを取得するには、Web サイトにログインする必要があります。私はこのようなスロットを持っています:
最初の 2 つのステップ (接続) では、コンソールに HTML コードが表示されます。最後のステップではデータが取得されません。リダイレクトもエラーもありません。
ここで、見知らぬ部分は、ページを webview に表示するようにコードを変更すると、qDebug
何も表示されませんが、読み込まれたコードが webview に正しく表示されることです。
さて、コンテンツをファイルに保存できます。しかし、なぜ何も見えないのかを本当に理解したいと思いますqDebug
qt - QNetworkReply から読み取る ファイルに書き込む
a を実行して、割り当てられたQNetworkRequest
を取得したとしますQNetworkReply
。大きなファイル (1 GB など) の場合、4k バイト配列バッファーを作成し、4k x 4k のデータをその配列に読み取り、同時に開いているファイルストリームに書き込むにはどうすればよいですか? たとえば、同等の C# コードは次のようになります (私は Qt ではなく C# に精通しています)。
- - 編集
実際に私がやろうとしているのは、アプリケーションを実行するたびにダウンロードを再開する機能です。ダウンロードを再開しようとするたびに、range
ヘッダーを設定しQNetworkRequest
て残りのデータを取得するだけなので、データを一度にではなく段階的に書き込む必要があります。
qt - QNetworkAccessManager / QNetworkReply を使用して readyRead() を使用してダウンロードすると、RAM が消費されます
次のセットアップとシナリオがあります。
- 実行中の QT/QML アプリケーション。20MB のファイルを
/tmp/IMAGE
(QNetworkManager()
、QNetworkReply()
、を使用してreadyRead()
)にダウンロードするようにトリガーできます。 /tmp
RAM ディスクです - 40 MB 以上の空き容量があります (QT/QML アプリケーションの実行中)- QT/QML アプリケーションの実行中に
wget
20MB のファイルを簡単に転送できます/tmp/IMAGE
ただし、QT/QML アプリケーションを介してファイルをダウンロードしようとすると (および-signal を使用QNetworkManager()
すると、qt/qml アプリケーションは、ファイルの半分が実際にダウンロードされる前であってもメモリ不足キラーによって強制終了されます (およびのサイズ)。QNetworkReply()
readyRead()
downloadProgress()
/tmp/IMAGE
私が理解している限り、readyRead()
チャンクの部分的なダウンロード、ディスクへの書き込み、使用済み RAM のクリア、次のチャンクのダウンロードと書き込みのために特に設計されています。
ただし、その方法は、たとえば使用するよりも多くの RAM を消費するようですwget
-10MB のファイルをダウンロードした後、Qt/QML アプリケーションには説明できない巨大なメモリフットプリントがあります。
私が基本的にやっていることは、次のreadyRead()
名前のスロットに接続することpartialDownloadFinished()
だけです:file->write(reply->readAll());
チャンクサイズが大きくなる可能性があるかどうかも確認しbytesAvailable()
ましたが、そうではないようです。
私の次の推測では、データは (RAM) ディスクに書き込まれるよりも速くダウンロードされますが、そうではないようです。
だから私は立ち往生しています。これについて手がかりやヒントを持っている人はいますか?
どうもありがとう!