import java.io.IOException;
import java.util.concurrent.*;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
/**
* @ClassName: ThreadProxy
* @Description: 根据输入的url,获取对应的内容
* @author
* @date 2012-1-10 下午2:23:46
* @version V1.0
*/
public class ThreadProxy {
/**
* @Title: main
* @Description: 根据输入的url,获取对应的内容
* @param args
* @author
* @date 2012-1-10
*/
public static void main(String[] args) {
String url = "http://www.apache.org";
try {
new ThreadProxy().get(url);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Title: get
* @Description: 根据输入的url,获取对应的内容
* @param url
* @author
* @date 2012-1-10
*/
public void get(final String url) {
MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager();
// 创建 HttpClient 的实例
final HttpClient httpClient = new HttpClient(manager);
// 代理的主机
ProxyHost proxy = new ProxyHost("openproxy.huawei.com", 8080);
// 使用代理
httpClient.getHostConfiguration().setProxyHost(proxy);
// 创建Get连接方法的实例
final HttpMethod getMethod = new GetMethod(url);
// 使用系统提供的默认的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
// 创建缓冲线程池
ExecutorService service = Executors.newCachedThreadPool();
// Future 表示异步计算的结果
Future<String> future = service.submit(new Callable<String>() {
@Override
public String call() throws Exception {
try {
// 请求URI
System.out.println("executing request : " + url);
// 执行getMethod
int status = httpClient.executeMethod(getMethod);
System.out.println("status:" + status);
// 连接返回的状态码
if (HttpStatus.SC_OK == status) {
System.out.println("Connection to "
+ getMethod.getURI() + " Success!");
// 获取到的内容
String responseBody = getMethod
.getResponseBodyAsString();
System.out.println(responseBody);
}
} catch (URIException e) {
e.printStackTrace();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
});
try {
//如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用).
future.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
service.shutdown();
// 释放连接
getMethod.abort();
}
}
分享到:
相关推荐
3. 关于线程安全:`HttpClient`不是线程安全的,如果你在多线程环境中使用,需要为每个线程创建新的`HttpClient`实例,或者使用线程池和连接池来管理。 4. Android API 22及之后,`HttpClient`被标记为过时,推荐...
- 注意线程安全问题,HttpClient对象通常不是线程安全的,可能需要为每个请求创建新的HttpClient实例,或者使用线程池和HttpRoutePlanner。 在提供的压缩包中,你可能会找到上述步骤的详细代码示例,以及关于如何...
- 创建HttpClient实例,可以选择使用DefaultHttpClient或者使用HttpClientBuilder自定义配置。 - 创建HttpRequestBase子类实例,如HttpGet、HttpPost,设置请求URI和请求头。 - 配置连接管理器、请求配置和认证...
这个工具类可能包含静态方法,用于初始化HttpClient实例、执行GET或POST请求,并处理返回的结果。例如: ```java public class HttpClientUtil { private static CloseableHttpClient httpClient; static { //...
HttpClient实例不是线程安全的,建议为每个线程或每个请求创建新的HttpClient实例,或者使用线程池来管理HttpClient实例。 9. **释放资源** 使用完HttpClient后,记得调用`close`方法关闭连接管理器,以避免资源...
1. 创建`HttpClient`实例,`HttpClient httpClient = new DefaultHttpClient();` 2. 创建`HttpGet`或`HttpPost`对象,设置URL。 3. 对于`HttpPost`,使用`setEntity()`方法添加请求体。 4. 使用`httpClient.execute...
通过`HttpClient`实例,我们可以配置请求头、设置超时、管理连接池等。 2. `HttpGet` / `HttpPost`:这些是常见的HTTP方法的表示,用于构造HTTP请求。例如,`HttpGet`用于GET请求,`HttpPost`用于POST请求。 3. `...
5. **使用方法**:使用HttpClient需要导入相关jar包,然后创建HttpClient实例,构造HttpGet或HttpPost对象,设置请求参数,最后通过HttpClient实例执行请求并获取响应。 6. **连接管理**:HttpClient 4.3引入了更...
在这里,`HttpClients.createDefault()`创建了一个默认配置的`HttpClient`实例,而`HttpGet`则指定了请求的URL。接下来,我们可以使用`HttpClient`的`execute`方法发送请求: ```java CloseableHttpResponse ...
首先,让我们了解如何初始化HttpClient实例。HttpClient的使用通常始于创建一个HttpClient对象。你可以使用`HttpClients.createDefault()`来创建一个基本配置的实例,或者通过`HttpClientBuilder`自定义配置,如设置...
// 创建HttpClient实例 HttpClient httpClient = new DefaultHttpClient(); // 创建HttpGet请求 HttpGet httpGet = new HttpGet("https://example.com"); // 设置连接管理器 SchemeRegistry schemeRegistry = new ...
使用HTTPClient进行HTTP通信时,开发者可以创建`HttpClient`实例,然后使用`HttpGet`或`HttpPost`等方法构造请求。例如,发起一个GET请求可以这样写: ```java CloseableHttpClient httpClient = HttpClients....
- **创建HttpClient实例**:使用`HttpClientBuilder`构建器创建HttpClient对象,可以配置连接池大小、超时等参数。 - **构建HttpGet/HttpPost请求**:通过`HttpGet`或`HttpPost`构造HTTP请求,设置URL、方法和请求...
接下来,`HttpClientUtil.java`文件可能是实现HttpClient工具类,提供一个静态方法来创建和初始化HttpClient实例。这个方法可能包含以下步骤: 1. 创建一个CloseableHttpClient实例,通常使用HttpClientBuilder构建...
9. **HttpClientBuilder**:提供了一种构建HttpClient实例的灵活方式,允许你在初始化时配置各种参数。 10. **CloseableHttpClient**:实现了自动关闭连接的接口,防止资源泄漏。 为了使用HttpClient,你需要将...
1. 创建HttpClient实例,通常是通过HttpClient的默认构造函数。 2. 创建特定HTTP方法的实例,例如GetMethod,传入请求的URL。 3. 使用HttpClient实例的execute方法执行HttpMethod。 4. 处理响应,获取并解析...
- 创建HttpClient实例,例如`CloseableHttpClient httpClient = HttpClients.createDefault();` - 构建HttpGet或HttpPost对象,指定目标URL。 - 发送请求并获取HttpResponse,如`HttpResponse response = ...
4. **代理服务器**:HttpClient 支持通过代理服务器进行网络访问,适应企业内网环境。 总结,Apache HttpClient 4.5.5 是一个强大且可靠的网络通信工具,它的易用性、灵活性和高性能使其成为 Java 开发者的首选。...
首先,我们需要创建一个HttpClient实例,然后创建HttpGet或HttpPost对象来指定请求的URL。接着,我们可以通过设置Header、添加请求参数等方式定制请求。 2. **不断查询与数据存储**: 在这个例子中,程序会不断地...