关于HttpClient、HttpUrlConection、Socket的介绍
http://www.cnitblog.com/liaoqingshan/archive/2013/02/19/86980.html
关于网络优化之HttpClient及详细介绍
http://blog.csdn.net/heng615975867/article/details/9012303
HttpClient相对于HtttpUrlConection的特点:在连接管理和线程安全方面比较有优势。
如果应用程序采用了多线程进行网络访问,则应该使用Apache封装好的线程安全管理类ThreadSafeClientConnManager来进行管理。对于一个通信单元甚至是整个应用程序,Apache强烈推荐只使用一个HttpClient的实例。
例如:
/**
* 单例模式获得HttpClient对象**/
private static synchronized HttpClient getHttpClient() {
//个人设置
final int DEFAULT_SOCKET_TIMEOUT=5000;
final int DEFAULT_HOST_CONNECTIONS=10;
final int DEFAULT_MAX_CONNECTIONS=100;
final int DEFAULT_SOCKET_BUFFER_SIZE=10;
HttpClient httpClient=null;
if(httpClient == null) {
final HttpParams httpParams = new BasicHttpParams();
// 从线程池获取连接超时
ConnManagerParams.setTimeout(httpParams, 1000);
// 连接服务器超时
HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
// 从服务器获取数据超时
HttpConnectionParams.setSoTimeout(httpParams, DEFAULT_SOCKET_TIMEOUT);
// 设置每台主机最多连接次数
ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(DEFAULT_HOST_CONNECTIONS));
// 设置连接池中最多连接总数
ConnManagerParams.setMaxTotalConnections(httpParams, DEFAULT_MAX_CONNECTIONS);
// use expect-continue handshake
HttpProtocolParams.setUseExpectContinue(httpParams, true);
// 旧连接检查(此处设为false,不对旧连接检查)
HttpConnectionParams.setStaleCheckingEnabled(httpParams, false);
HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8);
HttpClientParams.setRedirecting(httpParams, false);
// set user agent
String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";
HttpProtocolParams.setUserAgent(httpParams, userAgent);
// disable Nagle algorithm
HttpConnectionParams.setTcpNoDelay(httpParams, true);
HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);
// scheme: http and https
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager manager = new ThreadSafeClientConnManager(httpParams, schemeRegistry);
httpClient = new DefaultHttpClient(manager, httpParams);
}
return httpClient;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
String url="http://www.baidu.com/";
HttpGet httpGet=new HttpGet(url);
HttpClient httpClient=getHttpClient();
try {
HttpResponse response=httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() ==HttpStatus.SC_OK) {
Log.i("-------请求成功---------------", "---哈哈-------");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
//HttpClient超时设置
//连接超时
client.getHttpConnectionManager().getParams().setConnectionTimeout(COMMON.TIMEOUTFROMPARTNER);
//读数据超时
client.getHttpConnectionManager().getParams().setSoTimeout(COMMON.TIMEOUTFROMPARTNER);