轉述Matrix上zhengyun_ustc所述
為了解決這個問題
二
一些移動網絡放置了代理服務器用來提高訪問速度
本類可以使用單線程
由於服務商在其網絡上可能存在一些針對回應數據最大長度的限制
三
此類實現了Runnable接口
此類使用了一些靜態成員變量
//當前只能由一個線程使用singleton
private static NetConnection singleton = new NetConnection();
private static HttpConnection httpConn;
private static String url;
private static String method;
private static byte[] data;
private static String contentType;
private static long lowRange;
private static long highRange;
private static boolean disableProxy;
private static boolean detached;
private static byte[] response;
類方法
//線程run方法
public void run()
//當前運行的線程執行完畢後
private synchronized void forceNotify()
//當資源正在被其它線程使用時
private synchronized void forceWait()
//關閉http連接
private static void severConnection()
由於使用了這些static成員變量
netConnection類的實現思想很簡單
/**
* 實現了連接邏輯
* 調用者可以在分離的線程中使用netConnection類的靜態連接
* @throws IllegalStateException 如果此方法直接其它類調用則拋出該異常
*/
public void run() {
if (url == null) {
throw new IllegalStateException(
}
DataOutputStream dos = null;
DataInputStream dis = null;
StringBuffer buffer = null;
try {
int permissions =
//根據method值
if (HttpConnection
permissions = Connector
} else if (HttpConnection
permissions = Connector
}
//如果關閉server代理功能
//原理
// 致使server視其為client發來的新請求
if (disableProxy) {
boolean hasQueryParams = false;
char[] ca = url
//判斷原URL中是否含有參數
for (int loop =
if (ca[loop] ==
hasQueryParams = true;
break;
}
}
//由於需要多次字符串拼接
StringBuffer noProxyUrl = new StringBuffer();
//將原URL內容復制到noProxyUrl
noProxyUrl
//如果原URL中含有參數
// 則需要在noProxyUrl中增加
// 否則直接在noProxyUrl中增加
// 這樣做為了後面增加no
if (hasQueryParams) {
noProxyUrl
} else {
noProxyUrl
}
//增加no
noProxyUrl
noProxyUrl
//將構造好的noProxyUrl復制到原URL
url = noProxyUrl
}
// 打開Http 連接
httpConn = (HttpConnection) Connector
//設置request方法
(method);
//如果request權限為READ(即request方法為GET)
//則需要設置http request屬性的Range
//原理
// server接收到該request後將把response數據分成小部分發回
// 從而避免了部分運營商對http response size的限制
if (permissions == Connector
if (lowRange >
StringBuffer range = new StringBuffer();
range
range
range
range
(
}
//否則
//那麼設置request的Content
} else if (permissions == Connector
// POST request
(
dos = ();
dos
}
} catch (Exception e) {
exceptionPipe = e;
//如果程序運行在多線程模式
if (detached) {
forceNotify();
}
return;
} finally {
try {
try {
if (dos != null) {
// 關閉dos
dos
}
} catch (Exception e) {
// 如果程序運行在多線程模式
if (exceptionPipe == null) {
exceptionPipe = e;
if (detached) {
forceNotify();
}
return;
}
} finally {
dos = null;
}
// 讀取http連接的回應代碼
int responseCode = ();
//當request方法為GET
//當request方法為POST
//如果上述兩種回應代碼均沒有收到
if (responseCode != HttpConnection
&& responseCode != HttpConnection
if (exceptionPipe == null) {
StringBuffer errorCode = new StringBuffer();
errorCode
errorCode
errorCode
errorCode
errorCode
exceptionPipe = new IOException(errorCode
if (detached) {
forceNotify();
}
return;
}
}
//如果收到了上述的兩種回應代碼之一
dis = ();
//循環讀取repsonse數據
int ch;
buffer = new StringBuffer();
while ((ch = dis
buffer
}
//將response數據進行必要的編碼轉換
response = buffer
//接收到回應後
//如果程序運行在多線程模式
if (detached) {
forceNotify();
}
return;
} catch (Exception e) {
if (exceptionPipe == null) {
exceptionPipe = e;
if (detached) {
forceNotify();
}
return;
}
} finally {
try {
if (dis != null) {
// 關閉dis
dis
}
} catch (Exception e) {
// 若關閉dis時發生異常
if (exceptionPipe == null) {
exceptionPipe = e;
if (detached) {
forceNotify();
}
return;
}
} finally {
dis = null;
}
try {
if (httpConn != null) {
//關閉http連接
();
httpConn = null;
}
} catch (Exception e) {
if (exceptionPipe == null) {
exceptionPipe = e;
if (detached) {
forceNotify();
}
return;
}
}
}
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26660.html