import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.SSLHandshakeException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import com.anal.UtilComm;
public class HttpClientFactory {
private static final String CHARSET_GBK = "GBK";
/**
* 异常自动恢复处理
* 使用HttpRequestRetryHandler接口实现请求的异常恢复
*/
private static HttpRequestRetryHandler requestRetryHandler = new HttpRequestRetryHandler() {
// 自定义的恢复策略
public synchronized boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
// 设置恢复策略,在发生异常时候将自动重试3次
if (executionCount > 3) {
// 超过最大次数则不需要重试
return false;
}
if (exception instanceof NoHttpResponseException) {
// 服务停掉则重新尝试连接
return true;
}
if (exception instanceof SSLHandshakeException) {
// SSL异常不需要重试
return false;
}
HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);
boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
if (!idempotent) {
// 请求内容相同则重试
return true;
}
return false;
}
};
/**
* 使用ResponseHandler接口处理响应
* HttpClient使用ResponseHandler会自动管理连接的释放
* 解决了对连接的释放管理
*/
private static ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
// 自定义响应处理
public synchronized String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
if (entity != null) {
String charset = EntityUtils.getContentCharSet(entity) == null ? CHARSET_GBK : EntityUtils.getContentCharSet(entity);
return new String(EntityUtils.toByteArray(entity), charset);
} else {
return null;
}
}
};
/**
* 获取DefaultHttpClient实例
*
* @param charset
* 参数编码集, 可空
* @return DefaultHttpClient 对象
*/
public static DefaultHttpClient getDefaultHttpClient(final String charset){
DefaultHttpClient httpclient = new DefaultHttpClient();
ArrayList headers = new ArrayList();
headers.add(new BasicHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"));
headers.add(new BasicHeader("Accept-Language", "zh-cn,en-us,zh-tw,en-gb,en;"));
headers.add(new BasicHeader("Accept-Charset","gbk,gb2312,utf-8,BIG5,ISO-8859-1;"));
headers.add(new BasicHeader("Connection","Close"));
headers.add(new BasicHeader("Cache-Control","no-cache"));
headers.add(new BasicHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; CIBA)"));
httpclient.getParams().setParameter("http.default-headers", headers);
//设置http头信息
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
//模拟浏览器,解决一些服务器程序只允许浏览器访问的问题
httpclient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, charset == null ? HTTP.UTF_8 : charset);
httpclient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,30000);
httpclient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT,60000);
httpclient.setHttpRequestRetryHandler(requestRetryHandler);
return httpclient;
}
/**
* get方式提交抓取网页
*
* @param url
* @param charset
* @throws IOException
* @throws ClientProtocolException
* @throws IOException
*/
public static String httpGet(HttpClient httpClient, String url,
String charset) throws ClientProtocolException, IOException {
HttpGet httpget = new HttpGet(url);
String content = null;
// 发送请求,得到响应
HttpResponse response = httpClient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null && HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
charset = EntityUtils.getContentCharSet(entity) == null ?
CHARSET_GBK : EntityUtils.getContentCharSet(entity);
content = UtilComm.getString(entity.getContent(),charset);
}
abortRequest(httpget);
return content;
}
/**
* post方式提交抓取网页
*
* @param url
* @param charset
* @throws IOException
* @throws ClientProtocolException
*/
public static String httpPost(HttpClient httpClient, String url,
String charset) throws ClientProtocolException, IOException {
HttpPost httppost = new HttpPost(url);
// 得到提交的POST值
List<NameValuePair> nvpsList = UtilComm.getNameValuePairs(url);
httppost.setEntity(new UrlEncodedFormEntity(nvpsList, charset));
// 得到返回值
String content = null;
HttpResponse response = httpClient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null && HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
charset = EntityUtils.getContentCharSet(entity) == null ?
CHARSET_GBK : EntityUtils.getContentCharSet(entity);
content = UtilComm.getString(entity.getContent(),charset);
}
abortRequest(httppost);
return content;
}
/**
* 释放HttpClient连接
*
* @param hrb
* 请求对象
* @param httpclient
* client对象
*/
public static void abortRequest(final HttpRequestBase hrb){
if (hrb != null && hrb.isAborted()) {
hrb.abort();
}
}
public static void shutdown(final HttpClient httpclient) {
if (httpclient != null) {
httpclient.getConnectionManager().shutdown();
}
}
}
分享到:
相关推荐
本项目提供的中文分词处理技术源代码旨在简化这一过程,让开发者能够轻松实现中文分词功能,进一步提升系统的性能和效率。 首先,中文分词是指将连续的汉字序列切分成具有语义的独立单位,这些单位被称为词。由于...
在图像处理领域,卷积是一种基础且至关重要的操作,它被广泛应用于图像增强、滤波、特征检测等任务。本文将深入探讨卷积的概念、原理及其在代码实现中的细节。 卷积是数学上的一个概念,当应用于图像处理时,它是...
为了实现在图片上添加中文,我们需要借助额外的库,比如Freetype2,一个开源的字体渲染引擎。本教程将指导你如何在OpenCV中利用Freetype来处理中文字符。 首先,你需要了解OpenCV的基本图像处理概念,包括读取、...
7. **信号同步**:包括载波同步、位同步和帧同步,这些都是在处理通信信号时需要考虑的问题。 8. **信噪比与误码率**:评估信号质量的重要指标,源代码可能会有计算和绘制这些参数的示例。 9. **信号估计与预测**...
本资源"中文汉字转化成拼音js代码.zip"提供了一种用JavaScript实现的功能,即把中文汉字转换为拼音,这对于一些需要处理汉字与拼音交互的应用非常有用,比如搜索引擎优化(SEO)、语音合成或者输入辅助工具等。...
标题中的"FPGA花式流水灯"是指在FPGA(Field-Programmable Gate Array)上实现的一种视觉效果,常用于初学者练习或者演示目的。它通过控制一组LED灯的亮灭顺序,形成流动的灯光效果。这个项目不仅包含了基本的数字...
网上书城html源代码是一个非常适合初学者和有一定基础的学习者深入理解HTML、JavaScript以及CSS的实践项目。这个项目提供了一套完整的网页结构和交互逻辑,让学习者可以通过实际操作来提升自己的网页设计和开发能力...
在图像处理领域,图像增强是一种常见的技术,用于改善图像的质量,突出重要的视觉特征,或使图像更适合特定的应用。本压缩包包含了一系列MATLAB代码,旨在帮助用户从实践角度深入理解图像增强处理。以下是对这些代码...
《Python中文自然语言处理基础与实战》是一本深入探讨如何使用Python进行中文文本处理的教程。这本书涵盖了从基础知识到实际应用的各种主题,旨在帮助读者掌握处理中文文本的关键技术和方法。提供的源代码和实验数据...
这段代码的主要功能是对一组资源配置和减排任务进行建模、求解,并进行分配、计算效率和减排量等分析。 代码涉及的数据处理和优化部分较多,主要集中在以下几个方面: 1. 加载和处理数据 从 Excel 文件 资源配置阶段...
在SAR图像处理中,C++是一种常用的编程语言,因为它提供了高效的内存管理和计算能力,非常适合处理大规模的数据。本压缩包包含了从RAW格式开始的全套SAR图像处理代码,对于学习和理解SAR图像处理流程非常有帮助。 ...
Python中文自然语言处理(NLP)是近年来在大数据和人工智能领域中备受关注的一个重要分支,尤其对于中文文本的理解和分析,Python提供了丰富的库和工具,使得开发者能够高效地进行文本预处理、情感分析、词性标注、...
标题“指纹处理图像处理源代码”揭示了这个压缩包中包含的是与指纹识别技术相关的图像处理源代码。这种技术在安全认证、生物识别系统等领域有着广泛的应用。图像处理是计算机科学的一个重要分支,用于对数字图像进行...
这段代码主要是一个基于ELM(Extreme Learning Machine)算法的分类器。ELM是一种单隐层前馈神经网络,具有快速训练和良好的泛化能力。下面我将对代码进行详细解释。 首先,代码的开头是一些环境设置,包括关闭报警...
《MATLAB在振动信号处理中的应用》是一本深入探讨如何使用MATLAB进行振动信号处理的专业书籍。MATLAB,全称“Matrix Laboratory”,是一款强大的数学计算软件,被广泛应用于工程、科学计算以及数据分析等领域。在...
ASP网上购物系统源代码是一种基于ASP(Active Server Pages)技术构建的BS(Browser-Server,浏览器-服务器)架构的电子商务平台。这样的系统主要用于实现在线销售、商品展示、订单处理、支付集成等多种功能,为用户...
在图像处理领域,源代码是理解算法和方法的关键。标题中的“图像处理源代码”意味着这个压缩包包含了一些用于处理图像的程序代码,这可能是由C++、Python、Java等编程语言编写的。这些源代码对于那些正在学习或研究...
**代码雨**是一种在计算机图形学中常见的特效,通常用于编程演示或艺术表现,它将文字或代码以连续下落的方式展示在屏幕上,营造出一种动态的视觉效果。在这个名为"代码雨c++源代码"的项目中,开发者使用了C++语言在...
而《冈萨雷斯数字图像处理》一书的图片MATLAB源代码,为实践操作提供了强大的工具和平台,使得理论与实际操作相结合,进一步推动了学习者在数字图像处理领域中的深入研究。 "数字图像处理(冈萨雷斯matlab版)工具包 ...
在C++编程领域,有一段备受推崇的代码——“boost::asio”,它被认为是世界上最强大的C++代码之一。它是一个跨平台的网络编程库,提供了异步I/O、TCP/UDP套接字、定时器、信号处理等功能。本文将为您详细介绍boost::...