質問

HTTPPOSTを実行するためにHttpURLConnectionを使用していますが、常に完全な応答が返されるとは限りません。問題をデバッグしたかったのですが、各行をステップスルーすると機能しました。タイミングの問題だと思ったので、Thread.sleepを追加して、コードを実際に機能させましたが、これは一時的な回避策にすぎません。なぜこれが起こっているのか、そしてどのように解決するのか疑問に思います。これが私のコードです: ジェネラコディセタグプレ

後で入力ストリームを読み取るために次のことを行います ジェネラコディセタグプレ

次のHTTPヘッダーを生成します ジェネラコディセタグプレ

他の投稿では、を使用してキープアライブをオフにすることが提案されました。 ジェネラコディセタグプレ

システムプロパティ、試してみたところ、ヘッダーが次のように変更されました ジェネラコディセタグプレ

接続ヘッダーは「閉じる」ですが、それでも応答全体を読み取ることができません。何が間違っているのでしょうか?

役に立ちましたか?

解決

あなたの問題はこの行にあると思います: ジェネラコディセタグプレ

javadocによると、availableはブロックせず、すべてのデータが利用可能になるまで待機しないため、最初のパケットを取得するとfalseが返される可能性があります。InputStreamから読み取る適切な方法は、次のとおりです。 ジェネラコディセタグプレ

読み取りは、入力ストリームに何も残っていないか、接続が閉じられている場合に-1を返し、その間、ネットワークをブロックして待機します。配列の読み取りも、単一バイトを使用するよりもはるかにパフォーマンスが高くなります。

他のヒント

見逃したかもしれませんが、コードの「入力」のデータ型は何ですか?一般にInputStreamsについて奇妙なことは、read(...)メソッドがデータが利用可能になるまでブロックし、その後そのデータのみを返す傾向があることです。実際には、EOFExceptionを明示的に強制するまで、InputStreamから読み取り、ByteArrayInputStreamまたはその他の構造に追加し続ける必要があります。

メッセージ全体を一度に読んでいる場合は、isr.available()を予想されるコンテンツの長さと比較できます。これが私がやった方法です: ジェネラコディセタグプレ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top