Android(2.3.x)でを使用DefaultHttpClient
してThreadSafeClientConnManager
HTTPリクエストをRESTサーバー(埋め込みJetty)に送信しています。
約200秒のアイドル時間の後、サーバーは[FIN]を使用してTCP接続を閉じます。Androidクライアントは[ACK]で応答します。これにより、ソケットは半分閉じた状態のままになります(サーバーはまだリッスンしていますが、データを送信できません)。
クライアントが(を介してHttpClient.execute
)その接続を再度使用しようとするとDefaultHttpClient
、ハーフクローズ状態を検出し、クライアント側のソケットを閉じて(したがって、[FIN / ACK]を送信してクローズを完了します)、リクエストの新しい接続。しかし、摩擦があります。
代わりに、ハーフクローズされたソケットを介して新しいHTTPリクエストを送信します。送信後にのみ、ハーフクローズ状態が検出され、クライアント側でソケットが閉じられます([FIN]がサーバーに送信されます)。もちろん、サーバーは要求に応答できないため([FIN]はすでに送信されています)、クライアントは要求が失敗したと見なし、新しいソケット/接続を介して自動的に再試行します。
最終的な結果として、サーバーはリクエストの2つのコピーを認識して処理します。
これを修正する方法について何かアイデアはありますか?(私のサーバーは2番目のコピーで正しいことを行いますが、ペイロードが2回送信されることに悩まされています。)
DefaultHttpClientは、最初に新しいHTTPパケットを書き込もうとしたときにソケットが閉じられたことを検出し、そのソケットをすぐに閉じて、新しいソケットを開始するべきではありませんか?サーバーが[FIN]を送信してから数分後に、ソケットで新しいHTTPリクエストがどのように送信されるかについて困惑しています。