2

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

3 回答 3

0

我认为对此的一个可能答案是,IP 下一层上的设备数据连接正在改变其状态,例如,当在给定时间内没有传入或传出数据时,可能存在某种待机状态,例如在我的例如 5 秒。

于 2012-08-24T15:18:03.087 回答
0

查看 ARO 工具,该工具可让您查看网络级别发生的情况。https://developer.att.com/developer/aro 该分析器将向您展示正在发生的所有不同网络通信,并帮助您更有效地利用网络。我在评论中发布的另一个链接解释了状态机以及空闲时不同时间的连接会发生什么。

于 2012-08-29T13:21:28.120 回答
0

您可以使用 volley 库及其功能。 1. 请求队列和优先级 2. 有效的请求缓存和内存管理 3. 库的可扩展性和自定义以满足我们的需求 4. 取消请求

并使用此链接http://www.androidhive.info/2014/05/android-working-with-volley-library-1/

于 2015-06-13T09:11:46.727 回答