使用HttpClient的HTTP请求太慢了?

时间:2012-09-16 23:50:53

标签: android eclipse httpclient keep-alive asynchttpclient

我正在尝试编写一个Android应用程序,它将一些帖子值发送到托管在专用服务器上的php文件并存储数组resoult

代码就是这个

   HttpPost httppost;
    DefaultHttpClient httpclient;

    httppost = new HttpPost("http://IP/script.php"); 
    HttpParams param = new BasicHttpParams(); 
    param.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);


  //  httppost.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);

    HttpProtocolParams.setContentCharset(param, "UTF-8");

    httpclient = new DefaultHttpClient(param);

    ResponseHandler <String> res=new BasicResponseHandler(); 
    List<NameValuePair> nameValuePairs;

    nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("id","1"));
    nameValuePairs.add(new BasicNameValuePair("api", "1"));


    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
Log.v("1",System.currentTimeMillis()+"");// Log to know the time diff
    String result= httpclient.execute(httppost, res);
Log.v("2",System.currentTimeMillis()+""); //  Log to know the time diff

此代码浪费大约2.5秒(在3G或WiFi上)发送帖子并从服务器获得“ok”字符串,即使有良好的wifi,这次只下降到2.2 / 2.0秒

我在通过同一部手机和3G连接到互联网的计算机上运行了一个简单的Ajax发送邮件脚本,这需要大约0.300毫秒才能做同样的事情¿相同的连接,相同的动作,2秒的差异?

///的 *** UPDATE

我在我的计算机上再次尝试了我的jquery脚本(使用移动3G + / HDSPA连接)

平均时间响应大约 250ms 第一次请求高达1.7秒,我试图以30秒的间隔发送帖子,平均时间为1.5秒时间,然后我试着发送一个间隔为2秒的帖子,第一个是1.41s和nexts 252ms

在这里,你们可以查看图表:http://i46.tinypic.com/27zjl8n.jpg

与电缆连接(标准家庭DSL)相同的测试总是提供 ~170ms 间隔的固定时间响应(不是这里没有可靠的参数,但恕我直言,可能第一次尝试稍微高一点)

所以在第一次尝试中有一些(或错误的)严重影响移动连接的东西,任何想法的人?

1 个答案:

答案 0 :(得分:7)

尝试使用此配置

HttpClient httpclient = new DefaultHttpClient();
HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);

这是关于 setTcpNoDelay 的javadoc:

public static void setTcpNoDelay (HttpParams params, boolean value)

  

自:API级别1

     

确定是否使用Nagle算法。 Nagle的   算法试图通过最小化数量来节省带宽   发送的细分。当应用程序希望减少网络时   延迟和提高性能,他们可以禁用Nagle的算法   (即启用TCP_NODELAY)。数据将提前发送,但需要付费   带宽消耗增加。

     

<强> 参数

     如果不使用Nagle的算法,那么

值为true(即启用   TCP_NODELAY),否则为false。