为什么对数据的第一个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) {}
}
}
}