編輯:關於Android編程
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方法獲取網絡圖片,並且保存到本地
由於代碼比較多,我就直接貼關鍵部分,文章最後附上項目壓縮包文件:
代碼篇:
調用:
btn_get.setOnClickListener(new View.OnClickListener() { @Override public 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 + ; } 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原來的格式)
調用:
btn_post.setOnClickListener(new View.OnClickListener() { @Override public 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 + ; } 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的時候,也就是在發送數據方面有不同,其他的都是一樣的。
如果運行過實例你就會發現,我們獲取到的html其實是文本文件,就和txt是一樣的,那麼如果我們要獲取服務器上的圖片,圖片的存儲格式稍有不同的就是二進制存儲,但是對於我們來說都是流,所以在處理的時候,我們只需要將輸入流轉化為BitMap就可以獲得圖片了。
調用:
btn_getPicture.setOnClickListener(new View.OnClickListener() { @Override public 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. 服務器下文件目錄是否正確
閒來無事,琢磨琢磨Android中的手勢交互,發現網上在手勢方面的文章並不是很多,而且很多的參考價值並不大。於是出此博文,與大家共勉。鑒於我寫此博文時對手勢交互的研究也不
在即時聊天中可能會存在一個隱藏的Bug,這個Bug根據手機的網速和性能有關系,比如你即時聊天中,你發送一消息,你的網絡情況不是很好,這個時候你發送的消息一直處於
第5節 BTChat本節開始介紹Arduino藍牙模塊,配合Android應用,實現一個藍牙聊天應用。5.1 什麼是藍牙簡單說就是一種不同設備之間點對點通訊的技術。有大篇
背景:之前有過兩篇寫activity的博客 android之activity的生命周期詳解:詳細介紹了activity的整個生命周期、各狀態間的轉換和返回桌
一、ArrayAdapter的介紹以及ListView的用法: Adap