標籤: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