2

私が制御するサーバーに HTTP 要求を行う Android アプリがあります。このサーバーはリクエストを別のサーバーに中継しますが、これは私が管理していないため、現在非常に過負荷になっています。リモートサーバーの遅延に対処するために、私が認識しているすべてのタイムアウトを増やしました。

私自身のサーバーでは、一部のクライアント (Android アプリ) が 15 秒後に HTTP 要求を中止し、同じ要求を再試行していますが、接続と読み取りのタイムアウトをそれよりもはるかに大きく設定しています。

私のサーバーのnginxは、ログに499エラーとして報告し、リクエストが到着してから約15秒後に常に発生します。

サーバーでwiresharkを使用して、クライアントが切断し(FINパケットを送信)、すぐに同じリクエストを再試行していることを確認しました。

自分の電話を使用して問題を再現できませんでした。サーバーに人為的な遅延を導入させても、電話は設定したタイムアウトを尊重します。最近の更新で、問題のある電話のパターンを検出できるかどうかを確認するために、ユーザーに関する基本的な情報 (電話のモデル、Android のバージョン、現在の接続の種類) の送信を開始しましたが、これまでのところパターンに気づいていません。

以前HttpClientにアプリで使用していて、この問題を修正するためにいくつかのアプローチを試みましたが、タイムアウトと再試行が発生し続けました。その後、に切り替えましたがHttpURLConnection、同じ動作が見られます。コードのHttpURLConnectionバージョンは非常に単純で、例からほとんどそのままで、さまざまなタイムアウト値を保存します。

InputStream is = null;
try
{
  URL url = new URL("my.server.com" + paramString);
  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  conn.setReadTimeout(180 * 1000);
  conn.setConnectTimeout(30 * 1000);
  conn.setRequestMethod("GET");
  conn.setDoInput(true);
  conn.connect();

  int response = conn.getResponseCode();
  is = conn.getInputStream();
}

ドキュメントのどこにも、この動作についての言及は見つかりませんでした。この 15 秒のタイムアウトが設定されている場所と、自分のタイムアウトが尊重されない理由について何か考えはありますか?

4

1 に答える 1

0

私はこの問題を自分で抱えていました。この問題を見た後一番の答えで解決することができました。変更後のリクエストは次のようになります。

...
URL url = new URL("my.server.com" + paramString);
System.setProperty("http.keepAlive", "false");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
...
于 2013-07-02T16:52:44.983 に答える