我在下面幾行中使用了一些東西:在一行中做一個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) {}
}
}
}
2012-08-23
domcyrus
+0
和您的問題是... –
+0
爲什麼數據連接上的第一個http請求如此緩慢? –