package qule.gino.zhihuread.http; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; 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.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.CoreProtocolPNames; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import android.util.Log; import qule.gino.zhihuread.BuildConfig; public class HttpManger { private static final String TAG = "HttpManger"; private static final String USER_AGENT = "QuleZhihuRead/Android"; final int ConnectionTimeout = 30000; final int SocketTimeout = 60000; final int SocketBufferSize = 4096; private HttpClient httpclient; private HttpContext localContext = new BasicHttpContext(); public final static int MAX_TOTAL_CONNECTIONS = 5; private byte[] buffer = new byte[4096]; private void ensureInitialized() { if (httpclient == null) { // synchronized (this) { HttpParams httpParameters = new BasicHttpParams(); httpParameters.setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); ConnManagerParams.setTimeout(httpParameters, ConnectionTimeout); ConnManagerParams.setMaxTotalConnections(httpParameters, MAX_TOTAL_CONNECTIONS); // Set the timeout in milliseconds until a connection is // established. HttpConnectionParams.setConnectionTimeout(httpParameters, ConnectionTimeout); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. HttpConnectionParams.setSoTimeout(httpParameters, SocketTimeout); HttpConnectionParams.setSocketBufferSize(httpParameters, SocketBufferSize); HttpClientParams.setRedirecting(httpParameters, false); HttpProtocolParams.setUserAgent(httpParameters, USER_AGENT); // 设置我们的HttpClient支持HTTP和HTTPS两种模式 SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); // 使用线程安全的连接管理来创建HttpClient ClientConnectionManager conMgr = new ThreadSafeClientConnManager(httpParameters, schReg); httpclient = new DefaultHttpClient(conMgr, httpParameters); } } public byte[] get(String urlStr) { if (BuildConfig.DEBUG) { Log.d(TAG, "- Request Url is - " + urlStr); } HttpGet httpGet = new HttpGet(urlStr); try { ensureInitialized(); httpGet.setHeader("Content-Type", "application/x-www-form-urlencoded"); HttpResponse response = null; response = httpclient.execute(httpGet, localContext); int statusCode = response.getStatusLine().getStatusCode(); // check the response status code, only HTTP-200 be allowed. if (statusCode != HttpStatus.SC_OK) { throw new IOException("http status exception, statusCode: " + statusCode); } HttpEntity entity = response.getEntity(); InputStream responseStream = entity.getContent(); ByteArrayOutputStream memStream = new ByteArrayOutputStream(); int bytesRead = 0; while ((bytesRead = responseStream.read(buffer)) > 0) memStream.write(buffer, 0, bytesRead); return memStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { } return null; } public byte[] httpGet(String urlStr) { if (BuildConfig.DEBUG) { Log.d(TAG, "- Request Url is - " + urlStr); } ByteArrayOutputStream out = new ByteArrayOutputStream(); try { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream(); int length = 0; while ((length = is.read(buffer)) > 0) { out.write(buffer, 0, length); } return out.toByteArray(); } catch (MalformedURLException e) { } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } }