Android的網絡通訊機制,毫無置疑是用來和網絡打交道的。通訊方式分爲兩種:Http方式和Socket方式。Socket通訊方式和Java中的沒有什麼區別,這個不是咱們今天說的重點。重點的是http通訊方式,咱們來看看她的如山真面目吧。
html
一:Http通訊方式分類
java
(1)HttpURLConnection方式
android
(2)HttpClient方式(這一種咱們明日再敘)
緩存
二:Http的請求方法
安全
有兩種方法:post方法和get方法。主要區別以下:
服務器
相同點:兩者都可以向服務器端傳送數據,而服務器端根據請求返回相應的數據後,關閉鏈接;
網絡
不一樣點:(1)get方法傳送的數據量小,不能大於2KB,post傳遞的則較大,通常不受限制
app
(2)post方法傳遞的參數值,不會顯示在URL上,而get傳遞的則會顯示在URL上
jsp
(3)post安全性較高,get安全性較低ide
三:HttpURLConnection請求方法--Get
在操做以前,咱們應該本身搭建一個服務器,而且寫一個服務器端的文件,這裏我寫的文件功能爲,根據傳遞的參數全不爲空的狀況下,輸出字符串的拼接形式。具體文件以下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <% String a = request.getParameter("a"); String b = request.getParameter("b"); if(a!=null&&b!=null){ out.println(a + b); }else { out.print("error"); } %> |
◆具體步驟:
能夠在主界面上添加一個按鈕,在按鈕單擊事件觸發時產生以下操做,說白了,就是把一下的操做放到按鈕的監聽事件中,就OK了。
(1)定義一個字符串,值爲服務器地址,因爲這裏是get方式進行請求數據,因此參數的傳遞方式爲:URL地址?鍵=值&鍵=值&。。。等,這裏的鍵要和服務器中接收時的鍵相對應。
//服務器的地址,注意這裏的參數傳遞方式,要直接寫在URL後面。形式爲:?鍵=值&鍵=值 String urlStr = "http://222.27.166.10:8080/MyServer/youcan.jsp?a=Hello&b=word"; |
(2)建立URL對象,並將上述服務器地址字符串轉化成URL地址
URL url = new URL(urlStr);//將服務器地址字符串變爲URL形式 |
(3)建立HttpURLConnection對象,經過URL對象的openConnection打開網址,注意此時只是打開網址
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 打開網址 |
(4)經過HttpURLConnection對象的connect方法進行與服務器的連接,這時才能夠與服務器打交道
conn.connect();// 連接 |
(5)經過HttpURLConnection的getInputStream方法得到輸入流,對服務器的返回數據進行讀取操做
in = conn.getInputStream();// 得到輸入流 BufferedReader br = new BufferedReader( new InputStreamReader(in));//得到輸入流的包裝流 String str = null;//存儲讀取出的一行數據 StringBuffer sb = new StringBuffer();//字符串數據的拼接 while ((str = br.readLine()) != null) {//作判斷是否是讀完了 sb.append(str);//若沒讀完,則拼接 } System.out.println(sb.toString());// 輸出的是服務器返回的值 |
(6)特別重要的一點:要在Manifest.xml文件中添加訪問網絡的權限,android中全部的關於網絡通訊的操做均須要加上權限。
<uses-permission android:name="android.permission.INTERNET" /> |
◆結果:在後臺輸出了字符串的拼接樣式
01-07 15:55:54.622: INFO/System.out(618): Helloword |
四:HttpURLConnection請求方法--Post
在這裏咱們一樣使用上述的服務器文件,返回字符串的拼接。
◆具體步驟:
(1)定義一個字符串,值爲服務器地址,因爲這裏是post方式進行請求數據,因此參數不能直接寫在URL後面,注意。
//服務器地址,注意這裏是post傳遞方式不能直接進行傳參 String urldata = "http://222.27.166.10:8080/MyServer/youcan.jsp"; |
(2)建立URL對象,並將上述服務器地址字符串轉化成URL地址
url = new URL(urldata); |
(3)建立HttpURLConnection對象,經過URL對象的openConnection打開網址,注意此時只是打開網址
//打開網址 conn = (HttpURLConnection) url.openConnection(); |
(4)設置HttpURLConnection對象的相關屬性,以下
//設置post方式不能緩存數據 conn.setUseCaches(false); //設置傳參的方式爲post conn.setRequestMethod("POST"); //設置輸出流 conn.setDoOutput(true); //設置輸入流 conn.setDoInput(true); |
(5)經過HttpURLConnection對象的connect方法進行與服務器的連接,這時才能夠與服務器打交道
//開始鏈接 conn.connect(); |
(6)經過HttpURLConnection對象的getOutputStream方法得到輸出流,將傳遞的參數寫入到其中。
//獲得輸出流,寫參數到Server中 out =conn.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); //傳遞參數的方式,經過輸出流寫數據的方式URLEncoder.encode的參數爲「鍵對應的值」,"編碼方式" dos.writeBytes("a="+URLEncoder.encode("quanquan", "utf-8")); DataOutputStream dos1 = new DataOutputStream(out); //傳遞參數的方式,經過輸出流寫數據的方式URLEncoder.encode的參數爲「鍵對應的值」,"編碼方式" dos1.writeBytes("b="+URLEncoder.encode("quanquan", "utf-8")); |
(7)經過HttpURLConnection對象的getInputStream方法得到輸入流,對服務器的返回數據進行讀取操做
//得到輸入流,獲得返回的數據 in = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); //進行返回數據的讀取 String line = null; StringBuffer sb = new StringBuffer(); while((line=br.readLine())!=null){ sb.append(line); } System.out.println(sb.toString()); |
◆結果:經過在控制檯輸出結果
01-07 15:55:54.622: INFO/System.out(618): quanquanquanquan |
Android通訊方式還有不少,可能這些方式喜歡的人各有不一樣,你們就哪一個用的習慣來哪一個吧,這裏我說的也不是很很全面,敬請諒解哈。