1

私の現在の問題は、これと非常によく似ています。

downloadFile(URL)新しい HttpURLConnection を作成し、それを開いて読み取り、結果を返す関数があります。同じ URL でこの関数を複数回呼び出すと、2 回目はほとんどの場合、応答コード -1 が返されます (ただし、例外はスローされません!!!)。

その質問の一番の答えは非常に役に立ちますが、私が理解しようとしていることがいくつかあります。

では、http.keepAlive を false に設定すると問題が解決する場合、正確には何を示しているのでしょうか? サーバーが http プロトコルに違反する方法で応答していることは? または、コードが何らかの形でプロトコルに違反している可能性が高いですか? トレースは何を教えてくれますか? 何を探すべきですか?

そして、これとの取引は何ですか:

エラーストリームからすべてを読み取る必要があります。そうしないと、次の接続が混乱し、それが -1 の原因になります。

これは、応答が何らかのタイプのエラー (応答コードは何ですか?) である場合、ストリームを完全に読み取る必要があることを意味しますか? また、http リクエストを試みるたびに、基本的に新しい接続を作成disconnect()し、最後にそれを ing します。

ただし、私の場合、401などは取得していません。それは常に 200 です。しかし、私の 2 番目の接続はほとんどの場合失敗します。これは、私が読んでいないはずの他のデータがあることを意味しますか(エラーストリームを完全に読み取る必要があるのと同様の方法で)?

これに光を当てるのを手伝ってください。私が見逃している基本的な http プロトコルの理解があるように感じます。

PS Apache HttpClient だけを使用していた場合、これらすべてのプロトコルの詳細を処理する必要はありませんか? それは私のためにすべてを処理しますか?

4

2 に答える 2

3

デフォルトの HTTP URL ハンドラーでのキープアライブのサポートには、非常にバグがあります。私たちはいつもそれをオフにします。

キープアライブが必要な場合は、プールされた接続マネージャーで Apache HttpClient を使用します。コードを変更したくない場合は、次のような別のハンドラーを取得できます。

http://www.innovation.ch/java/HTTPClient/

2 番目の接続が常に失敗する場合は、サーバーがキープアライブをサポートしていないことを意味します。キープアライブを使用すると、HTTP ハンドラーは単に接続を開いたままにします (切断を呼び出しても)。キープアライブがサポートされていない場合、サーバーは接続を閉じますが、接続で次のリクエストを行うまでハンドラーは認識しないため、2番目の接続は失敗します。

読み取りエラー ストリームに関しては、200 以外の応答を取得した場合にのみ適用されます。

于 2010-05-08T04:24:37.153 に答える
0

おそらく、froyo で修正されたこの HttpURLConnection バグについて話していると思います。

http://code.google.com/p/android/issues/detail?id=2939

他の回避策については、そのバグを参照してください。これが発生したバグでない場合は、再現可能なテスト ケースを使用してバグを報告してください http://code.google.com/p/android/issues/entry

于 2010-05-09T16:27:32.460 に答える