把这个帖子作为日记,记下来,如果title带有为什么,Javaeye会自动把它移到问答频道,重新输入一下,看看高手们的反应:
最近为了查一个问题,分别使用HttpClient3和HttpClient4发一个同样post请求到同一个server上,发现
HttpClient3比HttpClient4性能要好很多,测试结果是H3,平均时间是800ms,而httpClient4要3秒钟,代码如下:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.httpclient.DefaultMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
/*
* @author Tomy Zhou
* @since 1.0
* @version ; HttpClientTest.java 2010-7-6
**/
public class HttpClientTest {
public static void main(String[] args) throws Exception {
/***************************************
*
* Method1
*
* Using HttpClient3
*
*
*
*
*/
long startTime = System.currentTimeMillis();
NameValuePair[] postData = new NameValuePair[1];
postData[0] = new NameValuePair("hl", "zh-CN");
PostMethod post = new
PostMethod("http://www.google.com.hk/search");
HttpClient client = new HttpClient();
int httpStatusCode = -1;
InputStream in = null;
// Set RetryHandler
DefaultMethodRetryHandler retryhandler = new
DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled(true);
retryhandler.setRetryCount(3);
post.setMethodRetryHandler(retryhandler);
// Set Post Data
post.setRequestBody(postData);
BufferedReader ins = null;
String loginResult = null;
// Execute Post Request
try {
//
(client.getHttpConnectionManager()).closeIdleConnections(0);
httpStatusCode = client.executeMethod(post);
in = post.getResponseBodyAsStream();
ins = new BufferedReader(new InputStreamReader(in,
"ISO-8859-1"));
String line = null;
StringBuffer outbuffer = new StringBuffer();
while ((line = ins.readLine()) != null) {
outbuffer.append(line);
}
loginResult = outbuffer.toString();
System.out.println(loginResult);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (ins != null) {
ins.close();
}
if (post != null) {
post.releaseConnection();
//
(client.getHttpConnectionManager()).closeIdleConnections(0);
}
}
System.out.println("The httpClient3 duration is ======"
+ (System.currentTimeMillis() - startTime));
/*******************************************************************
*
*
*Using HttpClient4 method1 to test
*
*
*/
startTime = System.currentTimeMillis();
DefaultHttpClient httpclient = new DefaultHttpClient();
// 目标地址
HttpPost httppost = new
HttpPost("http://www.google.com.hk/search");
// 构造最简单的字符串数据
StringEntity reqEntity = new StringEntity("hl=zh-CN");
// 设置请求的数据
httppost.setEntity(reqEntity);
// 执行
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
// 显示结果
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(entity
.getContent(), "UTF-8"));
String line = null;
StringBuffer outbuffer = new StringBuffer();
while ((line = reader.readLine()) != null) {
outbuffer.append(line);
}
System.out.println(outbuffer);
} finally {
if (reader != null) {
reader.close();
}
}
httpclient.getConnectionManager().shutdown();
System.out.println("The httpClient4 duration is ======"
+ (System.currentTimeMillis() - startTime));
Thread.sleep(10000);
/*******************************************************************
*
*
*Using HttpClient4 method2 to test
*
*
*/
startTime = System.currentTimeMillis();
// 3.Use HttpClient4 - 2
DefaultHttpClient httpclient2 = new DefaultHttpClient();
// 目标地址
HttpPost httppost2 = new
HttpPost("http://www.google.com.hk/search");
// 构造最简单的字符串数据
List<org.apache.http.NameValuePair> formParams = new
ArrayList<org.apache.http.NameValuePair>();
formParams.add(new BasicNameValuePair("hl", "zh-CN"));
HttpEntity entityForm = new UrlEncodedFormEntity(formParams,
"UTF-8");
// 设置请求的数据
httppost2.setEntity(entityForm);
// 执行
HttpResponse response2 = httpclient2.execute(httppost);
HttpEntity entity2 = response2.getEntity();
System.out.println("----------------------------------------");
// 显示结果
BufferedReader reader2 = new BufferedReader(new
InputStreamReader(
entity2.getContent(), "UTF-8"));
String line2 = null;
StringBuffer outbuffer2 = new StringBuffer();
while ((line2 = reader2.readLine()) != null) {
outbuffer2.append(line2);
}
System.out.println(outbuffer2);
httpclient2.getConnectionManager().shutdown();
System.out.println("The httpClient4-2 duration is ======"
+ (System.currentTimeMillis() - startTime));
}
}
请大家赐教,什么原因造成这么大的差别。
分享到:
相关推荐
例如,在HttpClient 3.x中,代码可能会使用`***mons.httpclient.HttpClient`类和`***mons.httpclient.methods.GetMethod`等,而在4.x版本中,这些都被新的API所替代。程序员需要熟悉`org.apache....
HttpClient 4.5是其一个稳定版本,提供了许多增强的功能和性能优化。本文将深入探讨HttpClient 4.5的中文API和使用方法。 首先,`httpclient4中文API.pdf`是HttpClient 4.5的中文版API文档,是学习和使用HttpClient...
HttpClient 4.0.1是该系列的一个版本,它在前一版本的基础上进行了优化和增强,旨在提高性能、稳定性和易用性。在本文中,我们将深入探讨HttpClient 4的关键特性、使用方法以及常见应用场景。 1. **基本概念** - *...
HttpClient 4的最新帮助文档会详细讲解这些知识点,并可能包含示例代码和故障排查指南,帮助开发者更好地理解和使用这个强大的HTTP客户端库。通过深入学习和实践,可以有效地处理各种HTTP通信需求。
4. **HTTP连接管理(Connection Management)**:HttpClient通过`HttpClientConnectionManager`来管理连接池,控制TCP连接的创建、复用和关闭,提高性能。 5. **请求和响应的配置**:可以通过`RequestConfig`来设置...
3. **性能优化**:HttpClient允许我们自定义连接池大小、超时时间等参数,以优化性能。了解jar包中的配置选项,可以帮助我们根据实际需求调整HttpClient的性能。 总结来说,Apache HttpClient的源码和jar包为我们...
HttpClient 4.x版本相较于早期的3.x版本进行了许多改进,包括性能优化、API简化和错误处理的强化。在描述中提到的“httpclient4”,指的是HttpClient 4.x系列,这是一个稳定且广泛使用的版本。 在HttpClient 4.4.1....
在Android应用开发中,进行网络通信是常见的任务,其中两种主要的请求方式是使用`HttpURLConnection`和`HttpClient`。虽然两者都能实现HTTP通信,但它们在功能、使用方式和性能上存在一些区别。 首先,Apache ...
HTTPClient 4.4和4.5之间的主要差异可能在于错误修复、性能优化和新功能的添加。 HTTPCore是HTTPClient的核心组件,它提供了基本的HTTP协议处理功能,如TCP连接管理、HTTP消息解析和编码等。这个库的设计目的是为了...
2. **连接池管理**:通过HttpConnectionManager,可以管理连接池,提高性能和效率。 3. **HTTPS支持**:HttpClient支持SSL/TLS,可以安全地处理HTTPS连接。 4. **代理设置**:配置HttpClient可以使用HTTP代理或SOCKS...
4. **重试和恢复策略**:HttpClient内置了重试和恢复策略,当网络出现问题时,可以自动进行重试,保证请求的可靠性。 5. **异步和同步模式**:HttpClient提供同步和异步两种操作模式,适应不同场景的需求。 提到...
HttpClient 4.3是一个重大的更新,它引入了诸多增强功能和性能优化。首先,HttpClient 4.3支持了HTTP/1.1和HTTP/2协议,使开发者可以利用HTTP/2的多路复用(multiplexing)特性,提高并发请求的效率,减少网络延迟。...
3. **连接管理**:HttpClient提供了PoolingHttpClientConnectionManager,可以管理HTTP连接的生命周期,复用已建立的连接,提高性能。 4. **身份验证和安全**:HttpClient支持多种认证机制,如Basic Auth、Digest ...
本文将基于`httpclient4`源码,深入解析其核心概念和实现原理。 1. **连接管理**: HTTPClient4中的连接管理是通过`HttpClientConnectionManager`接口实现的,主要负责创建、复用和关闭TCP连接。`...
HttpClient 4.5.3是4.x系列的一个重要升级,它引入了更多新功能和改进,进一步增强了HttpClient的稳定性和可扩展性: - **HTTP/2支持**:HttpClient 4.5.3引入了对HTTP/2协议的支持,这是一个重要的进步,因为它...
总之,HttpClient 4.3.5是一个强大的HTTP客户端库,它提供了丰富的功能和良好的性能,尽管在新版本的Android中已不推荐使用,但对于支持旧版本Android的应用或者对性能有较高要求的项目,HttpClient仍然是一种可靠的...
4. **实体处理**:HttpClient支持对请求和响应中的实体进行编码和解码,如表单数据、JSON、XML等。EntityUtils类提供了读取和解析响应实体内容的方法。 5. **重试和恢复策略**:HttpClient可以通过设置RetryHandler...
3. 支持http和https:HttpClientUtil需要能够处理HTTP和HTTPS协议。HTTP协议不涉及数据加密,而HTTPS协议在HTTP的基础上加入了SSL/TLS层,提供数据加密和服务器身份验证,确保通信安全。HttpClient支持SSL/TLS,只需...
可以通过设置连接超时、读写超时、最大连接数、连接复用策略等来优化HttpClient的性能。 10. **异步操作**: HttpClient也支持异步操作,通过`HttpAsyncClient`类,可以在回调函数中处理响应,适合于高并发场景。...