Android上构建基于httpclient的网络连接池

  1. package xiaogang.enif.net;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.Socket;  
  5. import java.net.UnknownHostException;  
  6. import java.security.KeyManagementException;  
  7. import java.security.KeyStore;  
  8. import java.security.KeyStoreException;  
  9. import java.security.NoSuchAlgorithmException;  
  10. import java.security.UnrecoverableKeyException;  
  11. import java.security.cert.CertificateException;  
  12. import java.security.cert.X509Certificate;  
  13.   
  14. import javax.net.ssl.SSLContext;  
  15. import javax.net.ssl.TrustManager;  
  16. import javax.net.ssl.X509TrustManager;  
  17.   
  18. import org.apache.http.HttpHost;  
  19. import org.apache.http.HttpResponse;  
  20. import org.apache.http.HttpVersion;  
  21. import org.apache.http.client.methods.HttpGet;  
  22. import org.apache.http.client.methods.HttpHead;  
  23. import org.apache.http.client.methods.HttpPost;  
  24. import org.apache.http.client.methods.HttpUriRequest;  
  25. import org.apache.http.client.params.HttpClientParams;  
  26. import org.apache.http.conn.ClientConnectionManager;  
  27. import org.apache.http.conn.params.ConnManagerParams;  
  28. import org.apache.http.conn.params.ConnPerRouteBean;  
  29. import org.apache.http.conn.params.ConnRouteParams;  
  30. import org.apache.http.conn.scheme.PlainSocketFactory;  
  31. import org.apache.http.conn.scheme.Scheme;  
  32. import org.apache.http.conn.scheme.SchemeRegistry;  
  33. import org.apache.http.conn.ssl.SSLSocketFactory;  
  34. import org.apache.http.impl.client.DefaultHttpClient;  
  35. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;  
  36. import org.apache.http.params.BasicHttpParams;  
  37. import org.apache.http.params.HttpConnectionParams;  
  38. import org.apache.http.params.HttpParams;  
  39. import org.apache.http.params.HttpProtocolParams;  
  40.   
  41. import xiaogang.enif.utils.IOUtils;  
  42.   
  43. import android.content.Context;  
  44. import android.net.Proxy;  
  45. import android.text.TextUtils;  
  46.   
  47.   
  48. public class HttpManager {  
  49.     private static final int DEFAULT_MAX_CONNECTIONS = 30;  
  50.     private static final int DEFAULT_SOCKET_TIMEOUT = 20 * 1000;  
  51.     private static final int DEFAULT_SOCKET_BUFFER_SIZE = 8192;  
  52.   
  53.     private static DefaultHttpClient sHttpClient;  
  54.     static {  
  55.         final HttpParams httpParams = new BasicHttpParams();  
  56.   
  57.         ConnManagerParams.setTimeout(httpParams, 1000);  
  58.         ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(10));  
  59.         ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);  
  60.   
  61.         HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);  
  62.         HttpProtocolParams.setContentCharset(httpParams, "UTF-8");  
  63.         HttpConnectionParams.setStaleCheckingEnabled(httpParams, false);  
  64.         HttpClientParams.setRedirecting(httpParams, false);  
  65.         HttpProtocolParams.setUserAgent(httpParams, "Android client");  
  66.         HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);  
  67.         HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);  
  68.         HttpConnectionParams.setTcpNoDelay(httpParams, true);  
  69.         HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);  
  70.   
  71.         SchemeRegistry schemeRegistry = new SchemeRegistry();  
  72.         schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));  
  73.         try {  
  74.             KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
  75.             trustStore.load(nullnull);  
  76.             SSLSocketFactory sf = new MySSLSocketFactory(trustStore);  
  77.             sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  
  78.             schemeRegistry.register(new Scheme("https", sf, 443));  
  79.         } catch (Exception ex) {  
  80.             // do nothing, just keep not crash  
  81.         }  
  82.   
  83.         ClientConnectionManager manager = new ThreadSafeClientConnManager(httpParams, schemeRegistry);  
  84.         sHttpClient = new DefaultHttpClient(manager, httpParams);  
  85.     }  
  86.   
  87.     private HttpManager() {  
  88.     }  
  89.   
  90.     public static HttpResponse execute(HttpHead head) throws IOException {  
  91.         return sHttpClient.execute(head);  
  92.     }  
  93.   
  94.     public static HttpResponse execute(HttpHost host, HttpGet get) throws IOException {  
  95.         return sHttpClient.execute(host, get);  
  96.     }  
  97.   
  98.     public static HttpResponse execute(Context context, HttpGet get) throws IOException {  
  99.         if (!IOUtils.isWifiAvailable(context) && isWapNetwork()) {  
  100.             setWapProxy();  
  101.             return sHttpClient.execute(get);  
  102.         }  
  103.   
  104.         final HttpHost host = (HttpHost)sHttpClient.getParams().getParameter(  
  105.                 ConnRouteParams.DEFAULT_PROXY);  
  106.         if (host != null) {  
  107.             sHttpClient.getParams().removeParameter(ConnRouteParams.DEFAULT_PROXY);  
  108.         }  
  109.   
  110.         return sHttpClient.execute(get);  
  111.     }  
  112.   
  113.     private static void setSinaWapProxy() {  
  114.         final HttpHost para = (HttpHost)sHttpClient.getParams().getParameter(  
  115.                 ConnRouteParams.DEFAULT_PROXY);  
  116.         if (para != null) {  
  117.             sHttpClient.getParams().removeParameter(ConnRouteParams.DEFAULT_PROXY);  
  118.         }  
  119.         String host = Proxy.getDefaultHost();  
  120.         int port = Proxy.getDefaultPort();  
  121.         HttpHost httpHost = new HttpHost(host, port);  
  122.         HttpParams httpParams = new BasicHttpParams();  
  123.         httpParams.setParameter(ConnRouteParams.DEFAULT_PROXY, httpHost);  
  124.     }  
  125.   
  126.     public static HttpResponse execute(Context context, HttpUriRequest post) throws IOException {  
  127.         if (!IOUtils.isWifiAvailable(context) && isWapNetwork()) {  
  128.             setSinaWapProxy();  
  129.         }  
  130.         return sHttpClient.execute(post);  
  131.     }  
  132.   
  133.     public static HttpResponse execute(Context context, HttpPost post) throws IOException {  
  134.         if (!IOUtils.isWifiAvailable(context) && isWapNetwork()) {  
  135.             setWapProxy();  
  136.             return sHttpClient.execute(post);  
  137.         }  
  138.   
  139.         final HttpHost host = (HttpHost)sHttpClient.getParams().getParameter(  
  140.                 ConnRouteParams.DEFAULT_PROXY);  
  141.         if (host != null) {  
  142.             sHttpClient.getParams().removeParameter(ConnRouteParams.DEFAULT_PROXY);  
  143.         }  
  144.         return sHttpClient.execute(post);  
  145.     }  
  146.   
  147.     private static boolean isWapNetwork() {  
  148.         final String proxyHost = android.net.Proxy.getDefaultHost();  
  149.         return !TextUtils.isEmpty(proxyHost);  
  150.     }  
  151.   
  152.     private static void setWapProxy() {  
  153.         final HttpHost host = (HttpHost)sHttpClient.getParams().getParameter(  
  154.                 ConnRouteParams.DEFAULT_PROXY);  
  155.         if (host == null) {  
  156.             final String host1 = Proxy.getDefaultHost();  
  157.             int port = Proxy.getDefaultPort();  
  158.             HttpHost httpHost = new HttpHost(host1, port);  
  159.             sHttpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, httpHost);  
  160.         }  
  161.     }  
  162.   
  163.     private static class MySSLSocketFactory extends SSLSocketFactory {  
  164.         SSLContext sslContext = SSLContext.getInstance("TLS");  
  165.   
  166.         public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException,  
  167.         KeyManagementException, KeyStoreException, UnrecoverableKeyException {  
  168.             super(truststore);  
  169.   
  170.             TrustManager tm = new X509TrustManager() {  
  171.                 @Override  
  172.                 public void checkClientTrusted(X509Certificate[] chain, String authType)  
  173.                         throws CertificateException {  
  174.                 }  
  175.   
  176.                 @Override  
  177.                 public void checkServerTrusted(X509Certificate[] chain, String authType)  
  178.                         throws CertificateException {  
  179.                 }  
  180.   
  181.                 @Override  
  182.                 public X509Certificate[] getAcceptedIssuers() {  
  183.                     return null;  
  184.                 }  
  185.             };  
  186.   
  187.             sslContext.init(nullnew TrustManager[] {  
  188.                     tm  
  189.             }, null);  
  190.         }  
  191.   
  192.         @Override  
  193.         public Socket createSocket(Socket socket, String host, int port, boolean autoClose)  
  194.                 throws IOException, UnknownHostException {  
  195.             return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);  
  196.         }  
  197.   
  198.         @Override  
  199.         public Socket createSocket() throws IOException {  
  200.             return sslContext.getSocketFactory().createSocket();  
  201.         }  
  202.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值