Android上构建基于httpclient的网络连接池
来源:互联网 发布:网络小说家花刺 编辑:程序博客网 时间:2024/04/29 02:13
说明:
1)我此前有文章介绍过httpclient比httputlconnection更高效的原因:在反复调用接口时,避免重复链接服务器;
2)此连接池支持https;
3)支持wap网络;
package xiaogang.enif.net;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.UnrecoverableKeyException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.HttpHost;import org.apache.http.HttpResponse;import org.apache.http.HttpVersion;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpHead;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpUriRequest;import org.apache.http.client.params.HttpClientParams;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.params.ConnManagerParams;import org.apache.http.conn.params.ConnPerRouteBean;import org.apache.http.conn.params.ConnRouteParams;import org.apache.http.conn.scheme.PlainSocketFactory;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;import xiaogang.enif.utils.IOUtils;import android.content.Context;import android.net.Proxy;import android.text.TextUtils;public class HttpManager { private static final int DEFAULT_MAX_CONNECTIONS = 30; private static final int DEFAULT_SOCKET_TIMEOUT = 20 * 1000; private static final int DEFAULT_SOCKET_BUFFER_SIZE = 8192; private static DefaultHttpClient sHttpClient; static { final HttpParams httpParams = new BasicHttpParams(); ConnManagerParams.setTimeout(httpParams, 1000); ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(10)); ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS); HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(httpParams, "UTF-8"); HttpConnectionParams.setStaleCheckingEnabled(httpParams, false); HttpClientParams.setRedirecting(httpParams, false); HttpProtocolParams.setUserAgent(httpParams, "Android client"); HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT); HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT); HttpConnectionParams.setTcpNoDelay(httpParams, true); HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); SSLSocketFactory sf = new MySSLSocketFactory(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); schemeRegistry.register(new Scheme("https", sf, 443)); } catch (Exception ex) { // do nothing, just keep not crash } ClientConnectionManager manager = new ThreadSafeClientConnManager(httpParams, schemeRegistry); sHttpClient = new DefaultHttpClient(manager, httpParams); } private HttpManager() { } public static HttpResponse execute(HttpHead head) throws IOException { return sHttpClient.execute(head); } public static HttpResponse execute(HttpHost host, HttpGet get) throws IOException { return sHttpClient.execute(host, get); } public static HttpResponse execute(Context context, HttpGet get) throws IOException { if (!IOUtils.isWifiAvailable(context) && isWapNetwork()) { setWapProxy(); return sHttpClient.execute(get); } final HttpHost host = (HttpHost)sHttpClient.getParams().getParameter( ConnRouteParams.DEFAULT_PROXY); if (host != null) { sHttpClient.getParams().removeParameter(ConnRouteParams.DEFAULT_PROXY); } return sHttpClient.execute(get); } private static void setSinaWapProxy() { final HttpHost para = (HttpHost)sHttpClient.getParams().getParameter( ConnRouteParams.DEFAULT_PROXY); if (para != null) { sHttpClient.getParams().removeParameter(ConnRouteParams.DEFAULT_PROXY); } String host = Proxy.getDefaultHost(); int port = Proxy.getDefaultPort(); HttpHost httpHost = new HttpHost(host, port); HttpParams httpParams = new BasicHttpParams(); httpParams.setParameter(ConnRouteParams.DEFAULT_PROXY, httpHost); } public static HttpResponse execute(Context context, HttpUriRequest post) throws IOException { if (!IOUtils.isWifiAvailable(context) && isWapNetwork()) { setSinaWapProxy(); } return sHttpClient.execute(post); } public static HttpResponse execute(Context context, HttpPost post) throws IOException { if (!IOUtils.isWifiAvailable(context) && isWapNetwork()) { setWapProxy(); return sHttpClient.execute(post); } final HttpHost host = (HttpHost)sHttpClient.getParams().getParameter( ConnRouteParams.DEFAULT_PROXY); if (host != null) { sHttpClient.getParams().removeParameter(ConnRouteParams.DEFAULT_PROXY); } return sHttpClient.execute(post); } private static boolean isWapNetwork() { final String proxyHost = android.net.Proxy.getDefaultHost(); return !TextUtils.isEmpty(proxyHost); } private static void setWapProxy() { final HttpHost host = (HttpHost)sHttpClient.getParams().getParameter( ConnRouteParams.DEFAULT_PROXY); if (host == null) { final String host1 = Proxy.getDefaultHost(); int port = Proxy.getDefaultPort(); HttpHost httpHost = new HttpHost(host1, port); sHttpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, httpHost); } } private static class MySSLSocketFactory extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null, new TrustManager[] { tm }, null); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } }}
- Android上构建基于httpclient的网络连接池
- Android上构建基于httpclient的网络连接池
- Android上构建基于httpclient的网络连接池
- Android上构建基于httpclient的网络连接池
- Android网络连接----使用HttpClient连接网络
- android网络连接之httpclient
- Android使用HttpClient请求网络上的数据
- android 访问网络三 (基于httpclient)
- Android网络连接之HttpURLConnection和HttpClient
- android-HttpClient和HttpURLConnection判断网络连接
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- iframe自适应高度的多种方法方法小结
- linux 创建连接命令 ln -s 软链接
- 面试题11 - 字符串的排列[算法]
- UIWebView的基本使用
- 围棋单机版-纵横十九道,迷煞多少人
- Android上构建基于httpclient的网络连接池
- linux下修改tomcat内存大小,针对处理OutOfMemoryError: PermGen space异常的情况
- python使用3目运算符
- Xcode添加百度移动统计报错处理
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 关于学习的随笔
- 面向对象设计 炒股还是要稳
- 六款小巧的HTTP Server[C语言]
- 虚拟机初始化一个类的过程