import java.io.InterruptedIOException;
import java.net.UnknownHostException;
import org.apache.commons.httpclient.NoHttpResponseException;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
/**
*/
public class httpClientUtil {
// public static CloseableHttpClient httpClient = HttpClients.createDefault();
/**
*/
/**
* 线程锁
*/
private final static Object syncLock = new Object();
/**
*初始化连接池
*/
private final static PoolingHttpClientConnectionManager poolconnmanager = new PoolingHttpClientConnectionManager();
/**
* 设置连接数、路由数
*/
static {
poolconnmanager.setMaxTotal(200);
poolconnmanager.setDefaultMaxPerRoute(150);
}
/**
* 生成请求属性配置
* @return
*/
private static RequestConfig getRequestConfig() {
return RequestConfig.custom()
.setSocketTimeout(10 * 1000)
.setConnectTimeout(10 * 1000)
.setConnectionRequestTimeout(10 * 1000)
.build();
}
/**
* 生成 CloseableHttpClient
* @return
*/
public static CloseableHttpClient getCloseableHttpClient() {
ConnectionKeepAliveStrategy connectionKeepAliveStrategy = (httpResponse, httpContext) -> {
return 10 * 1000; // tomcat默认keepAliveTimeout为20s(注:小于等于服务接收端http的keepAliveTimeout即可)
};
//防止重复创建httpClient对象
synchronized (syncLock){
return HttpClients.custom()
.setDefaultRequestConfig(getRequestConfig())
.setConnectionManager(poolconnmanager)
.setRetryHandler(httprequestretryhandler)
.setKeepAliveStrategy(connectionKeepAliveStrategy)
.build();
}
}
/**
* http请求超时属性设置
*/
private final static HttpRequestRetryHandler httprequestretryhandler = (exception, executionCount, context) -> {
if (executionCount >= 3) {//重试超过3次,放弃请求
return false;
}
if (exception instanceof NoHttpResponseException) {//服务器没有响应
return true;
}
if (exception instanceof InterruptedIOException) { //超时
return false;
}
if (exception instanceof UnknownHostException) {
return false;
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
return !(request instanceof HttpEntityEnclosingRequest);
};
}
/**
* 传输上传文件
* @param URL -- http://127.0.0.1:8888/projectname/lservlet?method=add
* @param fis -- new FileInputStream(new File(filepath))
* @return
*/public static String uploadFileNew(String URL,InputStream fis ) {
String codeStr ="";
CloseableHttpResponse response = null;
try {
HttpPost uploadFile = new HttpPost(URL);
System.out.println("---http-----"+URL);
uploadFile.addHeader("Accept", "application/json;charset=GBK");
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setCharset(Charset.forName("GBK"));
// 把文件加到HTTP的post请求中。
builder.addBinaryBody("file", fis, ContentType.APPLICATION_OCTET_STREAM,"");
HttpEntity multipart = builder.build();
uploadFile.setEntity(multipart);
response = httpClientUtil.getCloseableHttpClient().execute(uploadFile);
HttpEntity responseEntity = response.getEntity();
codeStr = EntityUtils.toString(responseEntity, "GBK");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return codeStr;
}
/**
* 接收单个文件
* @param request
* @param response
*/
public void addFile(HttpServletRequest request,HttpServletResponse response) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload uploader = new ServletFileUpload(factory);
PrintWriter out = null;
try {
request.setCharacterEncoding("GBK");
String path=request.getParameter("path");//绝对路径
path=path.replaceAll("[\\\\]{1,10}", "/");
path=path.replaceAll("[/]{1,10}", "/");
out = response.getWriter();
String paths=path.substring(0, path.lastIndexOf("/"));
File files=new File(paths);
if(!files.exists()) {
files.mkdirs();
}
File file = new File(path);
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
if(file.isFile()) {
//获取表单信息
List<FileItem> fileItems = uploader.parseRequest( request);
java.util.Iterator<FileItem> iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem fi = iter.next();
if (fi.isFormField()) {
// String fieldName = fi.getFieldName();
// System.out.println("fieldName:"+fieldName);
// String fieldvalue = new String(fi.getString().getBytes("iso-8859-1"),"GBK");
// System.out.println("fieldvalue:"+fieldvalue);
} else {
//获取文件名(带后缀)
fi.write(new File(path));
fi.getOutputStream().close();
break;
}
}
}
response.setCharacterEncoding("GBK");
out.print("true");
out.flush();
out.close();
} catch (Exception e) {
out.print("false");
e.printStackTrace();
}finally{
if(out != null){
out.close();
}
}
}