HttpClient工具类

import java.io.IOException;

import java.io.InterruptedIOException;

import java.io.UnsupportedEncodingException;

import java.net.UnknownHostException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Random;

import java.util.Set;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

 

import javax.net.ssl.SSLException;

import javax.net.ssl.SSLHandshakeException;

 

import org.apache.http.HttpEntity;

import org.apache.http.HttpEntityEnclosingRequest;

import org.apache.http.HttpHost;

import org.apache.http.HttpRequest;

import org.apache.http.NameValuePair;

import org.apache.http.NoHttpResponseException;

import org.apache.http.client.HttpRequestRetryHandler;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

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.client.protocol.HttpClientContext;

import org.apache.http.config.Registry;

import org.apache.http.config.RegistryBuilder;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.conn.routing.HttpRoute;

import org.apache.http.conn.socket.ConnectionSocketFactory;

import org.apache.http.conn.socket.LayeredConnectionSocketFactory;

import org.apache.http.conn.socket.PlainConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.protocol.HttpContext;

import org.apache.http.util.EntityUtils;

import org.apache.log4j.Logger;

 

/**

 * HttpClient工具类

 *

 * @return

 * @author SHANHY

 * @create 2015年12月18日

 */

public class HttpClientUtil

{

    static final int timeOut = 10 * 1000;

    private static CloseableHttpClient httpClient1 = null;

    private static CloseableHttpClient httpClient2 = null;

    private static CloseableHttpClient httpClient3 = null;

    private final static Object syncLock = new Object();

    private static final Logger LOG = Logger.getLogger(HttpClientUtil.class);

    private static void config(HttpRequestBase httpRequestBase)

    {

        // 设置Header等

//         httpRequestBase.setHeader("User-Agent", "Mozilla/5.0");

//         httpRequestBase

//         .setHeader("Accept",

//         "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");

//         httpRequestBase.setHeader("Accept-Language",

//        "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");// "en-US,en;q=0.5");

//         httpRequestBase.setHeader("Accept-Charset",

//         "ISO-8859-1,utf-8,gbk,gb2312;q=0.7,*;q=0.7");

        

     

//       httpRequestBase.setHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");

     

       httpRequestBase.setHeader("Connection", "Keep-alive");

         httpRequestBase.setHeader("Accept-Encoding", "gzip,deflate");

         httpRequestBase.setHeader("User-Agent", "Apache-HttpClient/4.5.2 (Java/1.8.0_73)");

         httpRequestBase.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

         httpRequestBase.setHeader("Host", "47.92.116.172");

         httpRequestBase.setHeader("Content-Length", "8");

//         httpRequestBase.setHeader("Pragma", "no-cache");

        

//         配置请求的超时设置

        RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut).setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();

        httpRequestBase.setConfig(requestConfig);

    }

  

    /**

     * 获取HttpClient1对象

     *

     * @return

     * @author SHANHY

     * @create 2015年12月18日

     */

    public static CloseableHttpClient getHttpClient1(String url)

    {

       // LOG.info("---CloseableHttpClient:---"+url);

      String hostname = url.split("/")[2];

      //LOG.info("---CloseableHttpClient:---"+hostname);

        int port = 80;

        if (hostname.contains(":"))

        {

            String[] arr = hostname.split(":");

            hostname = arr[0];

            port = Integer.parseInt(arr[1]);

        }

        if (httpClient1 == null)

        {

            synchronized (syncLock)

            {

                if (httpClient1 == null)

                {

                    httpClient1 = createHttpClient(200, 40, 100, hostname, port);

                }

            }

        }

        return httpClient1;

    }

    /**

     * 获取HttpClient对象

     *

     * @return

     * @author SHANHY

     * @create 2015年12月18日

     */

    public static CloseableHttpClient getHttpClient2(String url)

    {

        String hostname = url.split("/")[2];

        int port = 80;

        if (hostname.contains(":"))

        {

            String[] arr = hostname.split(":");

            hostname = arr[0];

            port = Integer.parseInt(arr[1]);

        }

        if (httpClient2 == null)

        {

            synchronized (syncLock)

            {

                if (httpClient2 == null)

                {

                    httpClient2 = createHttpClient(200, 40, 100, hostname, port);

                }

            }

        }

        return httpClient2;

    }

    /**

     * 获取HttpClient对象

     *

     * @return

     * @author SHANHY

     * @create 2015年12月18日

     */

    public static CloseableHttpClient getHttpClient3(String url)

    {

        String hostname = url.split("/")[2];

        int port = 80;

        if (hostname.contains(":"))

        {

            String[] arr = hostname.split(":");

            hostname = arr[0];

            port = Integer.parseInt(arr[1]);

        }

        if (httpClient3 == null)

        {

            synchronized (syncLock)

            {

                if (httpClient3 == null)

                {

                    httpClient3 = createHttpClient(200, 40, 100, hostname, port);

                }

            }

        }

        return httpClient3;

    }   

    /**

     *

     * @param maxTotal    最大连接数

     * @param maxPerRoute 每个路由基础的连接

     * @param maxRoute    目标主机的最大连接数

     * @param hostname    连接地址

     * @param port        连接端口

     * @return

     */

    public static CloseableHttpClient createHttpClient(int maxTotal,int maxPerRoute, int maxRoute, String hostname, int port)

    {

        ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();

        LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();

        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create().register("http", plainsf).register("https", sslsf).build();

        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);

        // 将最大连接数增加

        cm.setMaxTotal(maxTotal);

        // 将每个路由基础的连接增加

        cm.setDefaultMaxPerRoute(maxPerRoute);

        HttpHost httpHost = new HttpHost(hostname, port);

        // 将目标主机的最大连接数增加

        cm.setMaxPerRoute(new HttpRoute(httpHost), maxRoute);

        // 请求重试处理

        HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler()

        {

            public boolean retryRequest(IOException exception,int executionCount, HttpContext context)

            {

                if (executionCount >= 5)

                {// 如果已经重试了5次,就放弃

                    return false;

                }

                if (exception instanceof NoHttpResponseException)

                {// 如果服务器丢掉了连接,那么就重试

                    return true;

                }

                if (exception instanceof SSLHandshakeException)

                {// 不要重试SSL握手异常

                    return false;

                }

                if (exception instanceof InterruptedIOException)

                {// 超时

                    return false;

                }

                if (exception instanceof UnknownHostException)

                {// 目标服务器不可达

                    return false;

                }

                if (exception instanceof ConnectTimeoutException)

                {// 连接被拒绝

                    return false;

                }

                if (exception instanceof SSLException)

                {// SSL握手异常

                    return false;

                }

                HttpClientContext clientContext = HttpClientContext.adapt(context);

                HttpRequest request = clientContext.getRequest();

                // 如果请求是幂等的,就再次尝试

                if (!(request instanceof HttpEntityEnclosingRequest))

                {

                    return true;

                }

                return false;

            }

        };

        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).setRetryHandler(httpRequestRetryHandler).build();

        return httpClient;

    }

 

    private static void setPostParams(HttpPost httpost, Map<String, Object> params)

    {

        List<NameValuePair> nvps = new ArrayList<NameValuePair>();

        Set<String> keySet = params.keySet();

        for (String key : keySet)

        {

            nvps.add(new BasicNameValuePair(key, params.get(key).toString()));

        }

        try

        {

            httpost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));

        } catch (UnsupportedEncodingException e)

        {

            e.printStackTrace();

        }

    }

 

   /**

    *  POST请求URL获取内容

    * @param url

    * @param params

    * @return

    * @throws IOException

    */

    public static String post(String url, Map<String, Object> params,int i) throws IOException

    {

        HttpPost httppost = new HttpPost(url);

        config(httppost);

        setPostParams(httppost, params);

        CloseableHttpResponse response = null;

        try

        {

            if(i==0||i==1)

            {

            response = getHttpClient1(url).execute(httppost, HttpClientContext.create());

            }else if(i==2)

            {

            response = getHttpClient2(url).execute(httppost, HttpClientContext.create());

            }else

            {

            response = getHttpClient3(url).execute(httppost, HttpClientContext.create());

            }

            HttpEntity entity = response.getEntity();

            String result = EntityUtils.toString(entity, "utf-8");

            EntityUtils.consume(entity);

            return result;

        } catch (Exception e)

        {

        e.printStackTrace();

        return null;

        } finally

        {

            try

            {

                if (response != null)

                    response.close();

            } catch (IOException e)

            {

                e.printStackTrace();

            }

        }

    }

 

    /**

     * GET请求URL获取内容

     *

     * @param url

     * @return

     * @author SHANHY

     * @create 2015年12月18日

     */

    public static String get(String url,int i) {

        HttpGet httpget = new HttpGet(url);

        config(httpget);

        CloseableHttpResponse response = null;

        try

        {

          

            if(i==0||i==1)

            {

            response = getHttpClient1(url).execute(httpget,HttpClientContext.create());

            }else if(i==2)

            {

            response = getHttpClient2(url).execute(httpget,HttpClientContext.create());

            }else

            {

            response = getHttpClient3(url).execute(httpget,HttpClientContext.create());

            }        

       

       

            HttpEntity entity = response.getEntity();

            String result = EntityUtils.toString(entity, "utf-8");

            EntityUtils.consume(entity);

            return result;

        } catch (IOException e)

        {

            e.printStackTrace();

        } finally

        {

            try

            {

                if (response != null)

                {

                    response.close();

                }

            } catch (IOException e)

            {

                e.printStackTrace();

            }

        }

        return null;

    }

 

    public static void main(String[] args)

    {

      Map params=new HashMap();

      long zongjis=0;

      for(int i=0;i!=10000;i++)

      {

         params.put("param", "Mr(FFF)NaoNE7mZ(DDD)q4LutbtuBEYjvno4mdgF21edkDUDeJOFLaj8u(DDD)2ZAylS6I7Y TLriLpRY9O3Ico1zaluE2OnwxQ6SwimZ71hLzyRKTi(DDD)uFNlYLi(FFF)L5fTVdOro Ji9YVOah44Oeuq9maSEjZcRod4imZG6fA9XEegAZ8bHodd4DSnYpGsPl(DDD)wRf bjHJgCSP88xYjOJGfwyyn7P1ZZWP7QI4q6WdmETFlYpPqQrRbpLPWHJKmrb5 ZoUWiLt5K90ATCzGLURxHcn027htQlFlC3LDqYyeyER3Fw6TuKr(DDD)c0DIY3cV Ux0bKMGseEU9opM1EGOjzdULWWfrVctY70Kkt2HhBxdLAJZeVKuGvAWZsckg rv7qxqZfdayyj0bs2mEcZAujrVKUu(FFF)0SMbIsiYglMAfGK97nZznX6Kzhl1Gs IdQLRwGs8HwhdGaDGUaSs59oN9KyfMdR4c(FFF)stkRBrTqJ6QJauGNs2Y2Yc(FFF)q1 d2b9kGTQOEeYGzQhGbE1vI4UdXT(DDD)xLEPUQQ27TGXjuyaNiLf5LZ8FcYycJAM gMD(FFF)vY9p6DIC(FFF)(DDD)tqw3Dd0z51GHxc6OoEn4SgSs7NLdu(FFF)mag25EIa(FFF)vXqoitY fhf6h(FFF)(FFF)9DtJJBoCn116eEQDlHvt29gqqxyt(DDD)YxO11O2PfKnkVndKJQuHEiCk 3q4XtmKNWoXPEOgUlogO(FFF)0(FFF)0EawW(FFF)PwDf3mZ3Ez5wrQZ");

         params.put("orderid", "1484105435532");

         params.put("transcode", "800001");

         params.put("mchid", "10041");

         params.put("signature", "B892B1B6D62F8CD31B92BE835A1596B1");

         Random rand = new Random();

         int randNum = rand.nextInt(3);

          

         try

         {

           

            long start = System.currentTimeMillis();

            String url="http://192.168.1.108:5080"+(randNum+1)+"/bginter/100bingo.do";

            System.out.println("===============================================url"+url+"=====");

            String   res=HttpClientUtil.post(url, params,(randNum+1));

           long end = System.currentTimeMillis();

           zongjis= zongjis+(end - start);

            System.out.println("===============================================总耗时"+zongjis+"毫秒"+res);

            System.out.println("===================================================第"+i+"条记录"+res);         

           if(i!=0){

              System.out.println("=============================================用时平均 " + zongjis/i);

           }else

           {

              System.out.println("=============================================用时平均 " + zongjis);

           }

         } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

        

      }

 

    }

 

  

}

原文地址:https://www.cnblogs.com/chinaifae/p/10400478.html