android網絡開發詳解



1. 概要

      本文主要介紹在Android平臺上開發網絡應用的一些常用接口。

2. Android平臺上可以使用的幾種網絡接口

Android平臺的網絡應用絕大部分都是基於Java的編程接口的,也就是說我們開發類似的運用的時候可以有多種選擇,比J2me確實好多了。

2.1. 標準Java接口

java.net.*下面提供了訪問 HTTP 服務的基本功能。使用這部分接口的基本操作主要包括:

·         創建 URL 以及 URLConnection / HttpURLConnection 對象

·         設置連接參數

·         連接到服務器

·         向服務器寫數據

·         從服務器讀取數據 

?
import java.io.InputStream;   
import java.io.OutputStream;   
import java.net.URL;   
import java.net.URLConnection;   
import java.net.HttpURLConnection;   
 
try {   
    // 創建一個 URL 對象   
    URL url = new URL(your_url);   
     // 創建一個 URL 連接,如果有代理的話可以指定一個代理。   
    URLConnection connection = url.openConnection(Proxy_yours);   
    // 對於 HTTP 連接可以直接轉換成 HttpURLConnection,   
    // 這樣就可以使用一些 HTTP 連接特定的方法,如 setRequestMethod() 等   
    //HttpURLConnection connection =    
    (HttpURLConnection)url.openConnection(Proxy_yours);   
    // 在開始和服務器連接之前,可能需要設置一些網絡參數   
    connection.setConnectTimeout(10000);   
    connection.addRequestProperty("User-Agent",    
         "J2me/MIDP2.0");   
    // 連接到服務器   
    connection.connect();   
    // 往服務器寫數據,數據會暫時被放到內存緩存區中   
    // 如果僅是一個簡單的 HTTP GET,這一部分則可以省略   
    OutputStream outStream = connection.getOutputStream();   
    ObjectOutputStream objOutput = new ObjectOutputStream(outStream);   
    objOutput.writeObject(new String("this is a string..."));   
    objOutput.flush();   
 
    // 向服務器發送數據並獲取應答   
    InputStream in = connection.getInputStream();   
    // 處理數據   
    ...   
 
 
} catch (Exception e) {   
    // 網絡讀寫操作往往會產生一些異常,所以在具體編寫網絡應用時   
    // 最好捕捉每一個具體以採取相應措施   
}

 

 2.2. Apache接口 

  Apache HttpClient 是一個開源項目,彌補了 java.net.* 靈活性不足的缺點,爲客戶端的HTTP編程提供高效、最新、功能豐富的工具包支持。Android 平臺引入了Apache HttpClient 的同時還提供了對它的一些封裝和擴展,例如設置缺省的HTTP超時和緩存大小等。早期的 Android 曾同時包括 Commons HttpClientorg.apache.commons.httpclient.*  HttpComponents  org.apache.http.client.* ),不過當前版本 (1.5) 中開發者只能使用後者,也就是說類似以下的一些類:

使用這部分接口的基本操作與 java.net.* 基本類似,主要包括:

·         創建 HttpClient 以及 GetMethod / PostMethod HttpRequest 等對象

·         設置連接參數

·         執行 HTTP 操作

·         處理服務器返回結果

import org.apache.http.HttpEntity;   
      import org.apache.http.HttpHost;   
      import org.apache.http.HttpResponse;   
      import org.apache.http.auth.AuthScope;   
      import org.apache.http.auth.UsernamePasswordCredentials;   
      import org.apache.http.client.methods.HttpGet;   
      import org.apache.http.conn.params.ConnRoutePNames;   
      import org.apache.http.params. HttpConnectionParams;   
      import org.apache.http.client.params. HttpClientParams;   
      try {   
          // 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的)   
          HttpParams params = new BasicHttpParams();   
          // 設置連接超時和 Socket 超時,以及 Socket 緩存大小   
          HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);   
          HttpConnectionParams.setSoTimeout(params, 20 * 1000);   
          HttpConnectionParams.setSocketBufferSize(params, 8192);   
          // 設置重定向,缺省爲 true   
          HttpClientParams.setRedirecting(params, true);   
          // 設置 user agent   
          HttpProtocolParams.setUserAgent(params, userAgent);   
          // 創建一個 HttpClient 實例   
          // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient    
          // 中的用法,在 Android 1.5 中我們需要使用 Apache 的缺省實現 DefaultHttpClient   
          HttpClient httpClient = new DefaultHttpClient(params);   
          // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向   
          HttpGet httpGet = new HttpGet ("http://www.test_test.com/");   
          HttpResponse response = client.execute(httpGet);   
          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   
              // 錯誤處理,例如可以在該請求正常結束前將其中斷   
              httpGet.abort();   
          }   
 
          // 讀取更多信息   
          Header[] headers = response.getHeaders();   
          HttpEntity entity = response.getEntity();   
          Header header = response.getFirstHeader("Content-Type");   
      } catch (Exception ee) {   
          //   
      } finally {   
          // 釋放連接   
          client.getConnectionManager().shutdown();    
      }  
 
  import org.apache.http.HttpEntity;
        import org.apache.http.HttpHost;
        import org.apache.http.HttpResponse;
        import org.apache.http.auth.AuthScope;
        import org.apache.http.auth.UsernamePasswordCredentials;
        import org.apache.http.client.methods.HttpGet;
        import org.apache.http.conn.params.ConnRoutePNames;
        import org.apache.http.params. HttpConnectionParams;
        import org.apache.http.client.params. HttpClientParams;
        try {
            // 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的)
            HttpParams params = new BasicHttpParams();
            // 設置連接超時和 Socket 超時,以及 Socket 緩存大小
            HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);
            HttpConnectionParams.setSoTimeout(params, 20 * 1000);
            HttpConnectionParams.setSocketBufferSize(params, 8192);
            // 設置重定向,缺省爲 true
            HttpClientParams.setRedirecting(params, true);
            // 設置 user agent
            HttpProtocolParams.setUserAgent(params, userAgent);
            // 創建一個 HttpClient 實例
            // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient
            // 中的用法,在 Android 1.5 中我們需要使用 Apache 的缺省實現 DefaultHttpClient
            HttpClient httpClient = new DefaultHttpClient(params);
            // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向
            HttpGet httpGet = new HttpGet ("http://www.test_test.com/");
            HttpResponse response = client.execute(httpGet);
            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                // 錯誤處理,例如可以在該請求正常結束前將其中斷
                httpGet.abort();
            }
 
            // 讀取更多信息
            Header[] headers = response.getHeaders();
            HttpEntity entity = response.getEntity();
            Header header = response.getFirstHeader("Content-Type");
        } catch (Exception ee) {
            //
        } finally {
            // 釋放連接
            client.getConnectionManager().shutdown();
        }


?

      以下例子以 HttpGet 方式通過代理訪問 HTTPS 網站:

try {   
           HttpClient httpClient = new HttpClient();   
           // 設置認證的數據   
           httpClient.getCredentialsProvider().setCredentials(   
                   new AuthScope("your_auth_host", 80, "your_realm"),      
                   new UsernamePasswordCredentials("username", "password"));   
 
           // 設置服務器地址,端口,訪問協議   
           HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https");   
           // 設置代理   
           HttpHost proxy = new HttpHost("192.168.1.1", 80);   
           httpClient.getParams().setParameter   
                (ConnRoutePNames.DEFAULT_PROXY, proxy);      
 
           // 創建一個 HttpGet 實例   
           HttpGet httpGet = new HttpGet("/a/b/c");   
           // 連接服務器並獲取應答數據   
           HttpResponse response = httpClient.execute(targetHost, httpGet);   
 
           // 讀取應答數據   
           int statusCode = response.getStatusLine().getStatusCode();   
           Header[] headers = response.getHeaders();   
           HttpEntity entity = response.getEntity();   
       } catch (Exception ee) {   
           //   
        }


?

2.3. Android接口 

android.net.* 實際上是通過對 Apache  HttpClient 的封裝來實現的一個 HTTP 編程接口,同時還提供了 HTTP 請求隊列管理, 以及 HTTP 連接池管理,以提高併發請求情況下(如轉載網頁時)的處理效率,除此之外還有網絡狀態監視等接口。 

      以下是一個通過 AndroidHttpClient 訪問服務器的最簡例子:

import import android.net.http.AndroidHttpClient;   
      try {   
          AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);   
          // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向   
          HttpGet httpGet = new HttpGet ("http://www.test_test.com/");   
          HttpResponse response = client.execute(httpGet);   
          if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   
              // 錯誤處理   
          }   
 
          // 關閉連接   
          client.close();   
      } catch (Exception ee) {   
          //   
      }  
 
  import import android.net.http.AndroidHttpClient;
        try {
            AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);
            // 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向
            HttpGet httpGet = new HttpGet ("http://www.test_test.com/");
            HttpResponse response = client.execute(httpGet);
            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                // 錯誤處理
            }
 
            // 關閉連接
            client.close();
        } catch (Exception ee) {
            //
        }

另外當我們的應用需要同時從不同的主機獲取數目不等的數據,並且僅關心數據的完整性而不關心其先後順序時,也可以使用這部分的接口。典型用例就是 android.webkit 在轉載網頁和下載網頁資源時,具體可參考 android.webkit.* 中的相關實現。


發佈了32 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章