代码之家  ›  专栏  ›  技术社区  ›  pableu

使用httpclient的http post请求需要2秒钟,为什么?

  •  41
  • pableu  · 技术社区  · 15 年前
    更新: 我自己找到了答案,见下文:—)

    你好,

    我目前正在编写一个Android应用程序,它使用HTTP Post和AsyncTask在后台提交内容。我用 org.apache.http.client 用于此的包。我的代码基于 this example .

    基本上,我的代码如下:

    public void postData() {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://192.168.1.137:8880/form");
    
        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("id", "12345"));
            nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    
            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
    
        } catch (ClientProtocolException e) {
         Log.e(TAG,e.toString());
        } catch (IOException e) {
         Log.e(TAG,e.toString());
        }
    }
    

    问题是 httpclient.execute(..)行大约需要1.5到3秒 我不明白为什么。仅仅用HTTPGET请求一个页面大约需要80毫秒左右,所以问题似乎不是网络延迟本身。

    问题似乎也不在服务器端,我还尝试将数据发布到 http://www.disney.com/ 同样缓慢的结果。当本地向我的服务器发布数据时,Firebug显示1毫秒的响应时间。

    这发生在模拟器和我的NexusOne上(都是Android2.2)。

    如果你想看完整的代码,我已经把它装上了 GitHub .

    只不过是一个虚拟程序,只需按下按钮,就可以使用AsyncTask在后台进行HTTP发布。这是我的第一个Android应用程序,我的第一个Java代码很长一段时间。顺便提一句,也是我关于stackoverflow的第一个问题;-)

    你知道为什么httpclient.execute(httppost)需要这么长时间吗?

    2 回复  |  直到 13 年前
        1
  •  55
  •   pableu    15 年前

    好吧,我自己通过更多的调查解决了这个问题。我所要做的就是添加一个将HTTP版本设置为1.1的参数,如下所示:

    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    HttpClient httpclient = new DefaultHttpClient(params);
    

    我找到这个是因为 HttpHelper Class 从书呆子和一些尝试和错误。

    如果我没记错,HTTP1.0会为每个请求打开一个新的TCP连接。这能解释大延迟吗?

    HTTP POST请求现在在WLAN上需要50到150毫秒,在3G上需要300到500毫秒。

        2
  •  6
  •   henri    14 年前

    我不在Android上,但我在Windows平台上遇到了与HTTPClient4.0.1完全相同的问题,经过一番头疼之后,我找到了解决方案。

    HttpParams params = new BasicHttpParams();
    //this how tiny it might seems, is actually absoluty needed. otherwise http client lags for 2sec.
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpClient httpClient = new DefaultHttpClient(params);
    HttpResponse httpResponse;
    
    
    HttpPost httpPost = new HttpPost("http://"+server+":"+port+"/");
    StringEntity entity = new StringEntity(content, "utf-8");
    entity.setContentType("text/plain; charset=utf-8"); 
    httpPost.setEntity(entity);
    
    httpResponse=httpClient.execute(httpPost);
    
    String response = IOUtils.toString(httpResponse.getEntity().getContent(),encoding);
    httpResponse.getEntity().consumeContent();
    
    httpClient.getConnectionManager().shutdown();
    return(response);
    

    我不知道为什么用http1.1版本设置参数可以解决这个问题。但确实如此。 更奇怪的是,如果执行一个HTTPGET请求,症状就不会显示出来。

    不管怎样,我希望这能帮助一些人!

    H