網絡編程:Http通信與Socket通信


http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note
網絡編程:Http通信與Socket通信(移動互聯核心)
知識點概述:
1.Socket通信:面向連接(TCP)和無連接的(UDP)
2.HttpURLConnection 接口:Get和Post方式
3.HttpClient接口:Get和Post方式
 
知識點詳述:
1 Socket通信
Socket稱為”套接字“,用於描述IP地址和端口,它是支持TCP/IP協議的網絡通信的基本操作單元。有兩種主要的操作方式: 面向連接(TCP協議)和無連接( UDP協議)的。面向連接的操作比無連接操作的效率更低,但是數據的安全性更高。
OSI七層模型
TCP與UDP區別:

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務,傳輸數據前經過“三次握手”建立連接,保證數據傳輸的可靠性,但效率比較低。一般用於對於數據傳輸安全性較高的場合。

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議,面向無連接。UDP不提供可靠性,數據傳輸可能發生錯序,丟包,但效率較高。一般用於對於實時性要求較高的場合。

 
Android Socket編程
  (1)服務器實現步驟:
  指定端口實例化一個ServerSocket                                                               1. 實例化ServerSocket實例,指定端口號
  調用ServerSocket的accept()以在等待連接期間造成阻塞                        2. 調用accept方法,等待客戶端請求
  獲取位於該底層Socket的流以進行讀寫操作                                                 3. 有請求則返回Socket連接實例
  將數據封裝成流                                                                                            4. 通過Socket獲取輸入流讀取請求數據,並獲得輸出流做出響應
  對Socket進行讀寫                                                                                        5.關閉流
  關閉打開的流
 
 ServerSocket ss = null;
  // 創建一個ServerSocket,監聽一個端口號
  try {
   ss = new ServerSocket(8080);
   // 等待一個socket連接
   Socket s = ss.accept();
   // 緩沖讀取數據類
   BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
   // 從流中讀取一行數據
   String msgFromClient = br.readLine();
   System.out.println("msgFromClient:" + msgFromClient);
   // 參數2:true 表示數據自動刷新
   PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);
   pw.println("接受到了!");
   //刷新數據
     pw.flush();
           
  } catch (IOException e) {
   e.printStackTrace();
  }
 
  (2)客戶端實現步驟:
  通過IP地址和端口實例化Socket,請求連接服務器                   1.實例化Socket實例,指定服務端ip,以及服務端監聽此服務的端口號
  獲取Socket上的流以進行讀寫                                                  2. 通過Socket獲取輸出流向服務端發送消息
  把流包裝進BufferedReader/PrintWriter的實例                      3.再通過Socket獲取輸入流讀取服務端響應數據
  對Socket進行讀寫                                                                    4.關閉流
  關閉打開的流
 
Socket s = null;
  try {
   //和服務器斷建立連接
   s = new Socket("127.0.0.1", 8080);
   //將輸出流輸出
   PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
   pw.println("我是客戶端,我給你一些數據");
   // 刷新提交過去
   pw.flush();
   //接收客戶端的消息
   BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
   String msgFromServer = br.readLine();
   System.out.println("msgFromServer:" + msgFromServer);
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 
 
前序:HTTP通信 (B/S, C/S)
HTTP( 超文本傳輸協議)用於傳送www方式的數據,采用了請求/響應模型。客戶端向服務器發送一個請求,請求頭包含了請求的方法、URI、協議版本,以及包含請求修飾符、
客戶信息和內容的類似於MIME的消息結構。服務器以一個狀態行作為響應,響應的內容包括消息協議的版本、成功或者錯誤編碼,還包含服務器信息、實體元信息以及可能的實體內容。它是一個屬於應用層的面向對象的協議,由於其簡潔、快速,它適用於分布式超媒體信息系統。在internet上,http通信通常發生在TCP/IP連接之上,缺省端口是TCP 80,但其他的端口也是可用的。這並不預示着http協議在internet或其它網絡的其他協議之上才能完成,http只預示着一個可靠地傳輸。Android提供了HttpURLConnection和HttpClient接口來開發http程序。
2.HttpURLConnection 接口 java.net.*提供
HTTP通信中使用最多的就是Get和Post,Get請求可以獲取靜態頁面,也可以把參數放在URL字符串后面,傳遞給服務器。Post與Get的不同之處在於Post的參數不是放在URL字符串里面,而是放在http請求數據中。HttpURLConnection是Java的標准類,繼承自URLConnection類,兩個類都是抽象類,無法直接實例化對象。其對象主要通過URL的openConnection方法獲得。每次openConnection都將創建一個新的連接實例,在連接之前我們可以對其一些屬性進行設置,比如超時時間等:
connection.setDoOutput(true); //設置輸入流(Post時必須設置)
connection.setDoInput(true); // 設置輸出流(Post時必須設置)
connection.setRequestMethod("POST"); // 設置方式為POST(Post時必須設置)
connection.setInstanceFollowRedirects(true); //設置該請求是否重定向
connection.disconnect(); //關閉HttpURLConnection連接
connection.setConnectionTimeout(int time); //設置連接超時
connection.setReadTimeout(int time); //設置讀取超時
注:如果使用post方式,還需要設置請求的Content-Type
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
 
 
 
3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些類:
   HttpClient實現移動互聯的步驟,以及需要的類:
1) 封裝請求  HttpGet / HttpPost
2) 封裝連接參數 HttpParams--》BasicHttpParams, HttpConnectionParams
注:如果是Get方式則省略3)4)步驟
3)封裝請求參數 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity
4 )  設置請求參數   HttpPost-->setEntity(請求參數)
5) 封裝執行請求的客戶端實例並且設置連接參數  HttpClient--》DefaultHttpClient(HttpParams)
6)發送請求,接收響應  client.execute(HttpGet/HttpPost)--->HttpResponse
7 ) 判斷響應碼是否是200,如果正常則接收響應數據  resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity
8 ) 根據響應數據類型進行轉換   
(圖片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())
 (文本--》EntityUtils.toString(HttpEntity, "utf-8")
 
 
(1)HttpClient使用Get方式獲取數據,需要使用HttpGet來構建一個Get方式的http請求,然后通過HttpClient來執行這個請求,HttpResponse在接收這個請求后給出響應,最后通過“HttpResponse.getStatusLine().getStatusCode()"來判斷請求是否成功,並處理。可以直接使用如下方法將響應的實體元信息轉化為字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
HttpClient的Get方式請求步驟:
封裝HttpGet請求 new HttpGet(urlStr)
      通過HttpParams設置連接參數
獲取HttpClient實例  new DefaultHttpClient();
發送請求,接收響應
      HttpResponse = httpClient.excute(httpGet)
判斷響應碼是不是200.如果是200,接收響應數據
HttpEntity  = httpResponse.getEntity();
 
HttpClient使用Post方式獲取數據稍微復雜一點。首先好使用HttpPost來構建一個Post方式的http請求,
HttpPost httpRequest=new HttpPost("url");
需要使用NameValuePair來保存要傳遞的參數,可以使用BasicNameValuePair來構造一個要被傳遞的參數,然后通過add方法添加這個參數到NameValuePair中,
List<NameValuePair> params=new ArrayList<NameValuePair>();  //使用NameValuePair來保存要傳遞的Post參數
params.add(new BasicNameValuePair("par","HttpClient_android_Post"));  
//添加要傳遞的參數Post方式還需要設置所使用的字符集,最后就和Get方式一樣通過HttpClient來請求這個連接,返回響應並處理,
HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");  //設置字符集
httpRequest.setEntity(httpentity);  //為請求設置實體元信息
(2)DefaultHttpClient是默認的一個HTTP客戶端,我們可以使用它創建一個HTTP連接。
代碼如下:HttpClient hc=new DefaultHttpClient();
(3) HttpResponse是一個HTTP連接響應,當執行一個http連接后,就會返回一個HttpResponse,可以通過其獲得一些響應信息。下面是請求一個HTTP連接並獲得該請求是否成功的代碼:
HttpResponse hresponse=hc.execute(httpRequest);
if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //連接成功
}
示例代碼:
//HttpClient接口通過Post方式獲取數據
private String requestStringGet(String urlStr, String param){
String content = "";
//構建Post請求
HttpPost request = new HttpPost(urlStr);
//構建設置連接參數實例
HttpParams connParams = new BasicHttpParams();
//設置連接超時
HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);
//設置Socket超時
HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);
//構建請求參數
List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
requestParams.add(new BasicNameValuePair("name", param));
requestParams.add(new BasicNameValuePair("pass", param));
try{
//將請求參數列表轉化為請求實體元信息
HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");
//將請求實體元信息設置到請求中
request.setEntity(paramEntity);
//獲取執行請求的HttpClient
HttpClient client = new DefaultHttpClient(connParams);
 
//執行請求,獲取響應
HttpResponse response = client.execute(request);
//判斷是否正確響應
if(response.getStatusLine().getStatusCode() == 200){
//獲取響應內容
HttpEntity entity = response.getEntity();
if(entity!=null){
content = EntityUtils.toString(entity, "utf-8");
Log.d("TAG", "content: " + content);
content = parseJson(content).toString();
}else{
content = "服務器沒有給出響應內容";
}
}else{
content = "獲取響應失敗!";
}
 
}catch(SocketTimeoutException e){
Toast.makeText(this, "請求超時!", Toast.LENGTH_LONG).show();
}catch(IOException e){
e.printStackTrace();
Toast.makeText(this, "網絡連接出錯!", Toast.LENGTH_LONG).show();
}
return content;
}
 
 如何避免ANR:
Thread + Handler
AsyncTask
 
關於Handler:
 
關於AsyncTask:

AsyncTask:異步任務類<----------------------->handler

//如果我有耗時工作,並且耗時工作結束之后要更新UI

異步任務的泛型類型

AsynTask<參數,進度條參數,返回值>

啟動異步任務類:  調用  execute(參數); //不定長參數

當調用execute的時候執行 doInBackground(參數)

doInBackground方法在子線程執行,當其執行完畢后返回返回值,

然后執行 onPostExe
 
擴展: 網絡通信的中文亂碼問題
網絡通信中,產生亂碼的原因主要是通信過程中使用了不同的編碼方式:服務器中的編碼方式,傳輸過程中的編碼方式,傳輸到達中斷設備的編碼方式。因此在傳輸過程中就需要至少兩次編碼轉換:首先從服務器編碼轉換為網絡編碼,再從網絡編碼轉換為終端設備編碼。在轉換過程中發生任何情況都可能引起編碼混亂,一般情況下我們可以通過以下兩種方式來避免這個問題。
一種方式是:由於大部分終端設備都支持Unicode字符集,所以在連接網頁時,我們希望網頁數據在網絡傳輸時使用utf-8方式傳輸,這樣就可以很簡單地將utf-8轉換成
Unicode字符集了。
另一種方式是在數據傳遞過程中使用ISO-8859-1字符集,這樣就是直接使用ASCII編碼方式,當然在傳遞到終端設備時,需要將其數據反轉才能夠正常顯示。歸根結底,解決中文亂碼只需要兩個步驟:
使用getBytes("編碼方式");來對漢字進行重編碼,得到它的字節數組
再使用new String(Bytes[],"解碼方式");來對字節數組進行相應的解碼
 
作業描述:
訪問服務器文件內容並通過TextView將內容顯示出來
要求:1. 訪問data.xml文件用HttpUrlConnection實現,通過Thread + Handler優化性能,要求必須設置超時連接參數,注意編碼規范
           2. 訪問data.json文件用HttpClient實現,通過AsyncTask優化性能,要求必須設置超時連接參數,注意編碼規范

 

http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note
網絡編程:Http通信與Socket通信(移動互聯核心)
知識點概述:
1.Socket通信:面向連接(TCP)和無連接的(UDP)
2.HttpURLConnection 接口:Get和Post方式
3.HttpClient接口:Get和Post方式
 
知識點詳述:
1 Socket通信
Socket稱為”套接字“,用於描述IP地址和端口,它是支持TCP/IP協議的網絡通信的基本操作單元。有兩種主要的操作方式: 面向連接(TCP協議)和無連接( UDP協議)的。面向連接的操作比無連接操作的效率更低,但是數據的安全性更高。
OSI七層模型
TCP與UDP區別:

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務,傳輸數據前經過“三次握手”建立連接,保證數據傳輸的可靠性,但效率比較低。一般用於對於數據傳輸安全性較高的場合。

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議,面向無連接。UDP不提供可靠性,數據傳輸可能發生錯序,丟包,但效率較高。一般用於對於實時性要求較高的場合。

 
Android Socket編程
  (1)服務器實現步驟:
  指定端口實例化一個ServerSocket                                                               1. 實例化ServerSocket實例,指定端口號
  調用ServerSocket的accept()以在等待連接期間造成阻塞                        2. 調用accept方法,等待客戶端請求
  獲取位於該底層Socket的流以進行讀寫操作                                                 3. 有請求則返回Socket連接實例
  將數據封裝成流                                                                                            4. 通過Socket獲取輸入流讀取請求數據,並獲得輸出流做出響應
  對Socket進行讀寫                                                                                        5.關閉流
  關閉打開的流
 
 ServerSocket ss = null;
  // 創建一個ServerSocket,監聽一個端口號
  try {
   ss = new ServerSocket(8080);
   // 等待一個socket連接
   Socket s = ss.accept();
   // 緩沖讀取數據類
   BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
   // 從流中讀取一行數據
   String msgFromClient = br.readLine();
   System.out.println("msgFromClient:" + msgFromClient);
   // 參數2:true 表示數據自動刷新
   PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);
   pw.println("接受到了!");
   //刷新數據
     pw.flush();
           
  } catch (IOException e) {
   e.printStackTrace();
  }
 
  (2)客戶端實現步驟:
  通過IP地址和端口實例化Socket,請求連接服務器                   1.實例化Socket實例,指定服務端ip,以及服務端監聽此服務的端口號
  獲取Socket上的流以進行讀寫                                                  2. 通過Socket獲取輸出流向服務端發送消息
  把流包裝進BufferedReader/PrintWriter的實例                      3.再通過Socket獲取輸入流讀取服務端響應數據
  對Socket進行讀寫                                                                    4.關閉流
  關閉打開的流
 
Socket s = null;
  try {
   //和服務器斷建立連接
   s = new Socket("127.0.0.1", 8080);
   //將輸出流輸出
   PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
   pw.println("我是客戶端,我給你一些數據");
   // 刷新提交過去
   pw.flush();
   //接收客戶端的消息
   BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
   String msgFromServer = br.readLine();
   System.out.println("msgFromServer:" + msgFromServer);
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 
 
前序:HTTP通信 (B/S, C/S)
HTTP( 超文本傳輸協議)用於傳送www方式的數據,采用了請求/響應模型。客戶端向服務器發送一個請求,請求頭包含了請求的方法、URI、協議版本,以及包含請求修飾符、
客戶信息和內容的類似於MIME的消息結構。服務器以一個狀態行作為響應,響應的內容包括消息協議的版本、成功或者錯誤編碼,還包含服務器信息、實體元信息以及可能的實體內容。它是一個屬於應用層的面向對象的協議,由於其簡潔、快速,它適用於分布式超媒體信息系統。在internet上,http通信通常發生在TCP/IP連接之上,缺省端口是TCP 80,但其他的端口也是可用的。這並不預示着http協議在internet或其它網絡的其他協議之上才能完成,http只預示着一個可靠地傳輸。Android提供了HttpURLConnection和HttpClient接口來開發http程序。
2.HttpURLConnection 接口 java.net.*提供
HTTP通信中使用最多的就是Get和Post,Get請求可以獲取靜態頁面,也可以把參數放在URL字符串后面,傳遞給服務器。Post與Get的不同之處在於Post的參數不是放在URL字符串里面,而是放在http請求數據中。HttpURLConnection是Java的標准類,繼承自URLConnection類,兩個類都是抽象類,無法直接實例化對象。其對象主要通過URL的openConnection方法獲得。每次openConnection都將創建一個新的連接實例,在連接之前我們可以對其一些屬性進行設置,比如超時時間等:
connection.setDoOutput(true); //設置輸入流(Post時必須設置)
connection.setDoInput(true); // 設置輸出流(Post時必須設置)
connection.setRequestMethod("POST"); // 設置方式為POST(Post時必須設置)
connection.setInstanceFollowRedirects(true); //設置該請求是否重定向
connection.disconnect(); //關閉HttpURLConnection連接
connection.setConnectionTimeout(int time); //設置連接超時
connection.setReadTimeout(int time); //設置讀取超時
注:如果使用post方式,還需要設置請求的Content-Type
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
 
 
 
3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些類:
   HttpClient實現移動互聯的步驟,以及需要的類:
1) 封裝請求  HttpGet / HttpPost
2) 封裝連接參數 HttpParams--》BasicHttpParams, HttpConnectionParams
注:如果是Get方式則省略3)4)步驟
3)封裝請求參數 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity
4 )  設置請求參數   HttpPost-->setEntity(請求參數)
5) 封裝執行請求的客戶端實例並且設置連接參數  HttpClient--》DefaultHttpClient(HttpParams)
6)發送請求,接收響應  client.execute(HttpGet/HttpPost)--->HttpResponse
7 ) 判斷響應碼是否是200,如果正常則接收響應數據  resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity
8 ) 根據響應數據類型進行轉換   
(圖片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())
 (文本--》EntityUtils.toString(HttpEntity, "utf-8")
 
 
(1)HttpClient使用Get方式獲取數據,需要使用HttpGet來構建一個Get方式的http請求,然后通過HttpClient來執行這個請求,HttpResponse在接收這個請求后給出響應,最后通過“HttpResponse.getStatusLine().getStatusCode()"來判斷請求是否成功,並處理。可以直接使用如下方法將響應的實體元信息轉化為字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
HttpClient的Get方式請求步驟:
封裝HttpGet請求 new HttpGet(urlStr)
      通過HttpParams設置連接參數
獲取HttpClient實例  new DefaultHttpClient();
發送請求,接收響應
      HttpResponse = httpClient.excute(httpGet)
判斷響應碼是不是200.如果是200,接收響應數據
HttpEntity  = httpResponse.getEntity();
 
HttpClient使用Post方式獲取數據稍微復雜一點。首先好使用HttpPost來構建一個Post方式的http請求,
HttpPost httpRequest=new HttpPost("url");
需要使用NameValuePair來保存要傳遞的參數,可以使用BasicNameValuePair來構造一個要被傳遞的參數,然后通過add方法添加這個參數到NameValuePair中,
List<NameValuePair> params=new ArrayList<NameValuePair>();  //使用NameValuePair來保存要傳遞的Post參數
params.add(new BasicNameValuePair("par","HttpClient_android_Post"));  
//添加要傳遞的參數Post方式還需要設置所使用的字符集,最后就和Get方式一樣通過HttpClient來請求這個連接,返回響應並處理,
HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8");  //設置字符集
httpRequest.setEntity(httpentity);  //為請求設置實體元信息
(2)DefaultHttpClient是默認的一個HTTP客戶端,我們可以使用它創建一個HTTP連接。
代碼如下:HttpClient hc=new DefaultHttpClient();
(3) HttpResponse是一個HTTP連接響應,當執行一個http連接后,就會返回一個HttpResponse,可以通過其獲得一些響應信息。下面是請求一個HTTP連接並獲得該請求是否成功的代碼:
HttpResponse hresponse=hc.execute(httpRequest);
if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //連接成功
}
示例代碼:
//HttpClient接口通過Post方式獲取數據
private String requestStringGet(String urlStr, String param){
String content = "";
//構建Post請求
HttpPost request = new HttpPost(urlStr);
//構建設置連接參數實例
HttpParams connParams = new BasicHttpParams();
//設置連接超時
HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);
//設置Socket超時
HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);
//構建請求參數
List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
requestParams.add(new BasicNameValuePair("name", param));
requestParams.add(new BasicNameValuePair("pass", param));
try{
//將請求參數列表轉化為請求實體元信息
HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");
//將請求實體元信息設置到請求中
request.setEntity(paramEntity);
//獲取執行請求的HttpClient
HttpClient client = new DefaultHttpClient(connParams);
 
//執行請求,獲取響應
HttpResponse response = client.execute(request);
//判斷是否正確響應
if(response.getStatusLine().getStatusCode() == 200){
//獲取響應內容
HttpEntity entity = response.getEntity();
if(entity!=null){
content = EntityUtils.toString(entity, "utf-8");
Log.d("TAG", "content: " + content);
content = parseJson(content).toString();
}else{
content = "服務器沒有給出響應內容";
}
}else{
content = "獲取響應失敗!";
}
 
}catch(SocketTimeoutException e){
Toast.makeText(this, "請求超時!", Toast.LENGTH_LONG).show();
}catch(IOException e){
e.printStackTrace();
Toast.makeText(this, "網絡連接出錯!", Toast.LENGTH_LONG).show();
}
return content;
}
 
 如何避免ANR:
Thread + Handler
AsyncTask
 
關於Handler:
 
關於AsyncTask:

AsyncTask:異步任務類<----------------------->handler

//如果我有耗時工作,並且耗時工作結束之后要更新UI

異步任務的泛型類型

AsynTask<參數,進度條參數,返回值>

啟動異步任務類:  調用  execute(參數); //不定長參數

當調用execute的時候執行 doInBackground(參數)

doInBackground方法在子線程執行,當其執行完畢后返回返回值,

然后執行 onPostExe
 
擴展: 網絡通信的中文亂碼問題
網絡通信中,產生亂碼的原因主要是通信過程中使用了不同的編碼方式:服務器中的編碼方式,傳輸過程中的編碼方式,傳輸到達中斷設備的編碼方式。因此在傳輸過程中就需要至少兩次編碼轉換:首先從服務器編碼轉換為網絡編碼,再從網絡編碼轉換為終端設備編碼。在轉換過程中發生任何情況都可能引起編碼混亂,一般情況下我們可以通過以下兩種方式來避免這個問題。
一種方式是:由於大部分終端設備都支持Unicode字符集,所以在連接網頁時,我們希望網頁數據在網絡傳輸時使用utf-8方式傳輸,這樣就可以很簡單地將utf-8轉換成
Unicode字符集了。
另一種方式是在數據傳遞過程中使用ISO-8859-1字符集,這樣就是直接使用ASCII編碼方式,當然在傳遞到終端設備時,需要將其數據反轉才能夠正常顯示。歸根結底,解決中文亂碼只需要兩個步驟:
使用getBytes("編碼方式");來對漢字進行重編碼,得到它的字節數組
再使用new String(Bytes[],"解碼方式");來對字節數組進行相應的解碼
 
作業描述:
訪問服務器文件內容並通過TextView將內容顯示出來
要求:1. 訪問data.xml文件用HttpUrlConnection實現,通過Thread + Handler優化性能,要求必須設置超時連接參數,注意編碼規范
           2. 訪問data.json文件用HttpClient實現,通過AsyncTask優化性能,要求必須設置超時連接參數,注意編碼規范

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM