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();
}
}
}
分享到:
相关推荐
《数字图像处理MATLAB版源代码及图片》是针对冈萨雷斯所著的《数字图像处理》一书的配套资源,旨在帮助读者更好地理解和实践书中的理论知识。这个压缩包包含了两个主要部分:matlab教材示例图片和冈萨雷斯数字图像...
在图像处理领域,卷积是一种基础且至关重要的操作,它被广泛应用于图像增强、滤波、特征检测等任务。本文将深入探讨卷积的概念、原理及其在代码实现中的细节。 卷积是数学上的一个概念,当应用于图像处理时,它是...
为了实现在图片上添加中文,我们需要借助额外的库,比如Freetype2,一个开源的字体渲染引擎。本教程将指导你如何在OpenCV中利用Freetype来处理中文字符。 首先,你需要了解OpenCV的基本图像处理概念,包括读取、...
在IT领域,尤其是在嵌入式系统或低资源设备开发中,汉字点阵库是一种常见的技术,用于在有限的显示资源下呈现汉字。本主题聚焦于一个特定的12x12汉字点阵库,该库支持GBK编码,适用于C语言环境。点阵库是将汉字转化...
本资源"中文汉字转化成拼音js代码.zip"提供了一种用JavaScript实现的功能,即把中文汉字转换为拼音,这对于一些需要处理汉字与拼音交互的应用非常有用,比如搜索引擎优化(SEO)、语音合成或者输入辅助工具等。...
N代码在G代码中通常用于标记程序段,方便程序员理解和调试程序。 首先,了解N代码的作用。在数控程序中,N代码用于标识程序段的顺序,如N10、N20等,这样可以清晰地知道每个加工步骤的顺序。在复杂的加工程序中,...
网上药店源代码是一种基于JSP(JavaServer Pages)技术构建的电子商务应用,主要目标是为用户提供在线购买药品的服务。这个项目对于初学者来说是一个很好的学习平台,因为它涉及到Web开发的基本概念,如动态网页生成...
在IT领域,数字图像去雾处理是一项重要的技术,主要用于改善因大气散射导致的图像质量下降问题。在雾天拍摄的图像中,由于光线在传播过程中受到雾或霾的影响,图像会显得暗淡、对比度低,细节丢失。本文将详细讲解...
网上书城html源代码是一个非常适合初学者和有一定基础的学习者深入理解HTML、JavaScript以及CSS的实践项目。这个项目提供了一套完整的网页结构和交互逻辑,让学习者可以通过实际操作来提升自己的网页设计和开发能力...
在图像处理领域,图像增强是一种常见的技术,用于改善图像的质量,突出重要的视觉特征,或使图像更适合特定的应用。本压缩包包含了一系列MATLAB代码,旨在帮助用户从实践角度深入理解图像增强处理。以下是对这些代码...
在IT领域,数字图像处理是一项重要的技术,广泛应用于医学影像分析、遥感图像解析、视频处理、计算机视觉等多个领域。本资源"数字图像处理实验源代码"提供了C语言实现的图像处理算法,涵盖了一些基本且核心的操作,...
【猴子摘香蕉问题】是一个经典的逻辑推理和规划问题,常用于人工智能和计算机科学的教学中,尤其是在教授一阶谓词逻辑和状态空间搜索等概念时。在这个实验中,我们使用C++编程语言来模拟猴子如何通过一系列操作达到...
标题“指纹处理图像处理源代码”揭示了这个压缩包中包含的是与指纹识别技术相关的图像处理源代码。这种技术在安全认证、生物识别系统等领域有着广泛的应用。图像处理是计算机科学的一个重要分支,用于对数字图像进行...
《MATLAB在振动信号处理中的应用》是一本深入探讨如何使用MATLAB进行振动信号处理的专业书籍。MATLAB,全称“Matrix Laboratory”,是一款强大的数学计算软件,被广泛应用于工程、科学计算以及数据分析等领域。在...
《最优阵列处理》是一本深入探讨信号处理与通信系统中阵列技术的专业书籍,而提供的"Optimum Array Processing"压缩包则包含了该书的所有配套代码,这些代码都是在MATLAB环境下编写的,并且经过验证可以正确运行。...
在描述中提到的“自动生成拼音代码”,意味着我们不仅需要处理单个汉字,还可能涉及到整段中文文本的转换。在处理文本时,我们需要逐个字符分析,合并相邻的同音字,以及处理标点符号等非汉字字符。 通过以上步骤,...
ASP网上购物系统源代码是一种基于ASP(Active Server Pages)技术构建的BS(Browser-Server,浏览器-服务器)架构的电子商务平台。这样的系统主要用于实现在线销售、商品展示、订单处理、支付集成等多种功能,为用户...
接下来,MTD是在MTI基础上进一步发展的技术,它不仅能够检测移动目标,还能区分不同速度和方向的目标。MTD通过采用先进的信号处理算法,如空间自适应滤波器,来提高目标检测性能。MTD的优势在于其能更精确地估计目标...
**代码雨**是一种在计算机图形学中常见的特效,通常用于编程演示或艺术表现,它将文字或代码以连续下落的方式展示在屏幕上,营造出一种动态的视觉效果。在这个名为"代码雨c++源代码"的项目中,开发者使用了C++语言在...
而《冈萨雷斯数字图像处理》一书的图片MATLAB源代码,为实践操作提供了强大的工具和平台,使得理论与实际操作相结合,进一步推动了学习者在数字图像处理领域中的深入研究。 "数字图像处理(冈萨雷斯matlab版)工具包 ...