Android入門筆記 - 網路通訊 - HttpURLConnection

來源:互聯網
上載者:User

標籤:android   httpurlconnection   網路擷取圖片   http協議請求伺服器資料   

Android中要與遠程伺服器通訊有很多方法,今天我們來介紹使用http協議從遠程伺服器上擷取資料。

在android中可以使用 一下三種介面和伺服器進行http通訊:

1. java標準介面:java.net.*;

2. apathe介面: org. apache. http. *; 

3. android介面: android.net.*; 

今天我們介紹 java的標準介面,接下來我們將介紹:

1. 使用get方法擷取網路html檔案

2. 使用post方法擷取網路html檔案

3. 使用get方法擷取網狀圖片,並且儲存到本地

由於代碼比較多,我就直接貼關鍵區段,文章最後附上項目壓縮包檔案:


代碼篇:

1. 使用get方法擷取網路html檔案:

調用:

btn_get.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {getToOpenUrl("http://" + DOMIN + ":" + PORT+ "/Web1/login2.jsp?par1=10086&par2=199");}});
方法:

// 使用get方法擷取資料private void getToOpenUrl(String urladdr) {try {String resultData = "";URL url = new URL(urladdr);if (url != null) {HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(1000 * 5);InputStreamReader in = new InputStreamReader(connection.getInputStream());BufferedReader buffer = new BufferedReader(in);String inputLine = null;while ((inputLine = buffer.readLine()) != null) {resultData += inputLine + "\n";}in.close();buffer.close();connection.disconnect();mtv.setText(resultData != "" ? resultData : "讀取內容為null");}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
使用 步驟:

(1)初始化一個URL對象, 參數是要訪問的伺服器位址。 DOMIN 和 PORT 定義的是兩個靜態變數(如下),拼接之後: "http://192.168.1.19:8080/Web1/login2.jsp?par1=10086?par2=199",如果學習過jsp的應該知道這裡會傳兩個參數過去,然後伺服器jsp檔案可以處理(這裡就不做介紹了)

    private static final String DOMIN = "192.168.1.19";
    private static final String PORT = "8080";

(2)調用 url.openConnection() 獲得一個HttpURLConnection對象,這個就是我們和伺服器之間的連結。

(3)然後可以通過  conn.getInputStream() 得到伺服器的返迴流(我們請求的html檔案)

(4)解析流資料(這裡我們直接用resultData字串將擷取的html保持下來,最後答應在 textView中。這裡我們使用bufferreader是為了能一行一行的讀html檔案,保持html原來的格式)


2. 使用post方法擷取html檔案:

調用:

btn_post.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {postToOpenUrl("http://" + DOMIN + ":" + PORT+ "/Web1/login3.jsp");}});

方法:

// 使用post方法請求資料private void postToOpenUrl(String urladdr) {String resultData = "";try {URL url = new URL(urladdr);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.setRequestMethod("POST");conn.setUseCaches(true);conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");conn.connect();DataOutputStream out = new DataOutputStream(conn.getOutputStream());String content = "par=" + URLEncoder.encode("abcdefg", "gb2312");out.writeBytes(content);out.flush();out.close();BufferedReader buffer = new BufferedReader(new InputStreamReader(conn.getInputStream()));String inputLine = null;while ((inputLine = buffer.readLine()) != null) {resultData += inputLine + "\n";}buffer.close();conn.disconnect();mtv.setText(resultData != null ? resultData : "擷取資料為null");} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
這裡需要注意,使用post發送請求的時候,請求的參數欄位不是直接拼接在地址後面的,應該將參數寫在請求流中。而且post方法更安全,可以設定更多的參數,可傳輸資料量也比get大,關於post和get的區別請大家參看其它資料。

使用步驟:

(1)初始化URL對象

(2)調用 url.openConnection() 擷取HttpURLConnection對象

(3)設定可輸入輸出: conn.setDoInput(true);   conn.setDoOutput(true)

(4)佈建要求方式為 post :  conn.setRequestMethod("POST");

(5)設定字元編碼格式 Content-Type:  conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

(6)然後調用 conn.connect() ; 連結的伺服器,開啟通道

(7)然後初始化參數,並使用 writeBytes(content); 想伺服器發送請求。這裡就是將參數設定到流中發送到伺服器,參數相當於: ?par=abcdefg

DataOutputStream out = new DataOutputStream(conn.getOutputStream());String content = "par=" + URLEncoder.encode("abcdefg", "gb2312");out.writeBytes(content);out.flush();out.close();
(8)發送請求後就是接收伺服器返回資料,和前面的get獲得伺服器資料是一樣的。

大家會發現,在使用get和post的時候,也就是在發送資料方面有不同,其他的都是一樣的。


3. 使用get方法擷取網狀圖片:

如果運行過執行個體你就會發現,我們擷取到的html其實是文字檔,就和txt是一樣的,那麼如果我們要擷取伺服器上的圖片,圖片的儲存格式稍有不同的就是二進位儲存,但是對於我們來說都是流,所以在處理的時候,我們只需要將輸入資料流轉化為BitMap就可以獲得圖片了。

調用:

btn_getPicture.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Bitmap picture = getNetBitMap("http://" + DOMIN + ":" + PORT+ "/Web1/img.jpg");if (null != picture) {img_picture.setImageBitmap(picture);SaveJpgBitmapToLocal(picture, "/sdcard/", String.format(                                                 "portrait_%d" + ".jpg", System.currentTimeMillis()));} else {showToast("擷取網狀圖片失敗");}}});

方法:

// 擷取網狀圖片private Bitmap getNetBitMap(String mapurl) {Bitmap netPicture = null;HttpURLConnection conn;InputStream is;try {URL url = new URL(mapurl);conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);is = conn.getInputStream();netPicture = BitmapFactory.decodeStream(is);is.close();conn.disconnect();} catch (MalformedURLException e) {e.printStackTrace();} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}return netPicture;}
我們可以看到,處理方法和get完全一樣,只是在得到輸入資料流is後,我們直接將其轉化為了 BitMap而已。

調用部分還有一個方法是將擷取到的圖片save到本地:

// 儲存jpg圖片到本地private void SaveJpgBitmapToLocal(Bitmap bitmap, String path,String filename) {File file = new File(path, filename);OutputStream os;try {os = new FileOutputStream(file);bitmap.compress(CompressFormat.JPEG, 100, os);os.flush();os.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

好了,執行個體講解完畢,這裡加幾點注意事項:

如果你運行執行個體擷取不成功,可能是一下幾個原因造成的:

1. 看伺服器啟動木有

2. 伺服器位址,連接埠號碼

3. 伺服器下檔案目錄是否正確

4. 192.168.1.19 是本機在區域網路的地址,這裡不要使用 127.0.0.1,因為手機模擬器和自己本地的伺服器都佔用了這個換回地址

運行:


下載源碼地址:

http://download.csdn.net/detail/u013647382/8266051


Android入門筆記 - 網路通訊 - HttpURLConnection

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.