データに対する最初のhttpリクエストが非常に遅いのはなぜですか?
私は次の行で何かを使用しています:3つのHTTPリクエストを連続して(順番に)実行してから、指定された時間待機し、3つのHTTPリクエストを実行して再度ループします。
基本的にも機能しているkeep-aliveを使用していますが、最初のHTTPリクエストでは、3つのHTTPリクエストで開始するたびに2秒のペナルティがあります。最初のHTTPリクエストのみにこの2秒のペナルティがあります。連続するHTTPリクエスト間の待機時間を200ミリ秒程度に短縮すると、最初のリクエストにこの2秒のペナルティが発生することなく、すべてのリクエストが高速になります。
明らかに、これは最初のリクエストがキープアライブ接続を使用しない可能性があるように聞こえますが、実際にはそうではありません。サーバーでtcpdumpを実行すると、すべての要求が同じTCP接続を使用しており、新しい接続を閉じて再度構築する必要がないことがはっきりとわかります。サーバーのキープアライブ設定は60秒に設定されていますが、アプリでの待機時間はたとえば5秒です。また、WIFIに切り替えると、この動作がわかりません。同時に待機すると、すべてのリクエストが高速になります。
http接続コードはHttpURLConnectionを使用しており、次のようになります。
m_res.error = null;
HttpURLConnection connection;
try {
connection = (HttpURLConnection)(new URL(m_url + "/" + m_call.command).openConnection());
connection.setDoOutput(true); // triggers POST.
connection.setDoInput(true);
connection.setRequestProperty("Accept-Charset", m_charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + m_charset);
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Accept-Encoding", "gzip");
//connection.setChunkedStreamingMode(0);
OutputStream output = null;
try {
output = connection.getOutputStream();
output.write(m_call.query_string.getBytes(m_charset));
InputStream response = null;
try {
response = connection.getInputStream();
if ("gzip".equals(connection.getContentEncoding())) {
response = new GZIPInputStream(response);
}
}
catch (IOException e) {
response = connection.getErrorStream();
}
if (response == null) {
m_res.error = "Connection Error";
}
else {
m_res.body = getAsString(response);
m_res.status = connection.getResponseCode();
}
}
catch (IOException e) {
e.printStackTrace();
m_res.error = "Connection Error";
}
finally {
if (output != null)
try {
output.close();
} catch (IOException logOrIgnore) {}
}
}
}