android網路應用開發完全解析
Android網路應用開發,主要有兩種方式,一種是socket(是對tcp/udp協議的封裝),另外一種就是使用Http協議,Android中主要提供了兩種方式,HttpURLConnection和Apache HttpClient。下面對Android網路應用開發進行具體的闡述。
一、基於socket的網路通訊1、基於udp的socket編程步驟
定義碼頭
即:定義一個DatagramSocket對象ds
定義可以用來接收或者發送資料的集裝箱
即:定義DatagramPacket對象dp
在碼頭上用集裝箱接受對象發送過來的資料(ds.receive(dp))
關閉碼頭(ds.close())
2、基於tcp的socket編程步驟
二、使用HTTP協議訪問網路資源1、HttpURLConnection
JDK 的 java.net 包中已經提供了訪問 HTTP 協議的準系統:HttpURLConnection。HttpURLConnection是java的標準類,HttpURLConnection繼承自URLConnection,可用於向指定網站發送GET請求、POST請求。
下面是一個使用HttpURLConnection類的get請求訪問網路的工具類:
/** * getInputStream函數是為了擷取讀取伺服器端資源的位元組輸入資料流 * @param path是url字串 * @return InputStream */ public static InputStream getInputStream(String path) { URL url = null; try { url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 佈建要求方式 conn.setRequestMethod(GET); // 設定串連的逾時時間 conn.setConnectTimeout(5000); // 設定可以從伺服器端讀取資料 conn.setDoInput(true); // 擷取伺服器端的響應碼 if (conn.getResponseCode() == 200) { // 獲得讀取伺服器端資源的位元組輸入資料流 InputStream in = conn.getInputStream(); return in; } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
2、Apache HttpClient
HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程式需要直接通過 HTTP 協議來訪問網路資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的準系統,但是對於大部分應用程式來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支援 HTTP 協議的用戶端編程工具包,並且它支援 HTTP 協議最新的版本和建議。
httpClient就是一個增強版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection沒有提供的有些功能,HttpClient也提供了,但它只是關注於如何發送請求、接收響應,以及管理HTTP串連。
下面是使用httpClient get方式訪問網路的工具類:
/** * 讀取輸入資料流,返回資料 * @param stream * @return */ public static byte[] readStream(InputStream stream) throws IOException{ byte[] ret = null; ByteArrayOutputStream bout = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int len; while (true) { len = stream.read(buf); if (len == -1) { break; } bout.write(buf, 0, len); } //強制釋放臨時的資源 buf = null; ret = bout.toByteArray(); bout.close(); return ret; } /** * get要求方法 * @param url 網址 * @return */ public static byte[] doGet(String url) { byte[] ret = null; HttpGet request = new HttpGet(url); HttpClient client = new DefaultHttpClient(); try { HttpResponse response = client.execute(request); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { HttpEntity entity = response.getEntity(); InputStream stream = entity.getContent(); //返回的實際資料 ret = readStream(stream); stream.close(); } } catch (IOException e) { e.printStackTrace(); } return ret; }
3、HttpURLConnection與HttpClient的區別
在Android 2.2版本之前,HttpClient擁有較少的bug,因此使用它是最好的選擇。在Android 2.3版本及以後,HttpURLConnection則是最佳的選擇。對於新的應用程式應該更加偏向於使用HttpURLConnection。