使用HttpClient的HTTP请求太慢了?

Col*_*las 4 eclipse android 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
Run Code Online (Sandbox Code Playgroud)

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

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

/// ***更新

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

的平均时间应答是大约250毫秒,但总是在第一请求到1.7secs,我试图以30秒的间隔发送讯息和我得到1.5秒的平均时间,然后我试图发送以2秒的间隔的柱,所述第一是1.41s,接近252ms

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

这种与电缆连接(标准家用DSL)相同的测试始终提供约170ms间隔的固定时间响应(这里没有可靠的参数,但恕我直言,可能第一次尝试略高一点)

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

小智 7

尝试使用此配置

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

这是关于setTcpNoDelay的javadoc :

public static void setTcpNoDelay (HttpParams params, boolean value)

自:API级别1

确定是否使用Nagle的算法.Nagle的算法试图通过最小化发送的段数来节省带宽.当应用程序希望减少网络延迟并提高性能,他们可以禁用Nagle算法(即启用TCP_NODELAY).数据将提前发送,代价是带宽消耗增加.

参数

如果不使用Nagle的算法(即启用TCP_NODELAY),则值为true,否则为false.