第11章Android網(wǎng)絡編程(4學時)_第1頁
第11章Android網(wǎng)絡編程(4學時)_第2頁
第11章Android網(wǎng)絡編程(4學時)_第3頁
第11章Android網(wǎng)絡編程(4學時)_第4頁
第11章Android網(wǎng)絡編程(4學時)_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

移動平臺軟件設計主講教師張智計算機學院第11章Android網(wǎng)絡編程11.1TCP/IP根底11.2HTTP編程11.3調(diào)用Web效勞11.1TCP/IP根底TCP:TransmissionControlProtocol傳輸控制協(xié)議IP:InternetProtocol因特網(wǎng)互聯(lián)協(xié)議TCP/IP協(xié)議定義了電子設備如何連入Internet,以及數(shù)據(jù)如何在它們之間進行傳輸?shù)臉藴?。TCP/IP協(xié)議是Internet最根本的協(xié)議,也是Internet的根底。TCP/IP協(xié)議不只是TCP和IP這兩個協(xié)議,而是指整個TCP/IP協(xié)議族TCP/IP網(wǎng)絡層次結構這里的英文縮寫都是TCP/IP協(xié)議族的一員Socket編程和HTTP編程Socket編程HTTP編程(物理層)Socket概念網(wǎng)絡上的兩個應用程序之間的通信是分層進行的,socket是應用程序進行網(wǎng)絡通信的接口。Socket=主機地址+端口號關于端口號如果要發(fā)起網(wǎng)絡連接,不僅需要知道遠程機器的地址或名字。而且,還需要一個端口號??蛻舳撕托谄鞅仨毷孪燃s定所使用的端口,如果系統(tǒng)兩局部所使用的端口不一致,那就不能進行通信。TCP/IP系統(tǒng)中的端口號是一個16位的數(shù)字,它的范圍是0~65535。實際上,小于1024的端口號保存給預定義的效勞。Socket=主機地址+端口號HTTP概念HTTP:HyperTextTransferProtocol超文本傳輸協(xié)議HTTP協(xié)議是互聯(lián)網(wǎng)上應用最多、最為廣泛的一種網(wǎng)絡協(xié)議。HTTP是一種是用于從WWW效勞器傳輸超文本到本地瀏覽器的傳送協(xié)議。它可以使瀏覽器更加高效,使網(wǎng)絡傳輸減少。HTTP的POST和GET兩種命令模式POST是被設計用來向上放東西的,而GET是被設計用來從效勞器取東西的,GET也能夠向效勞器傳送較少的數(shù)據(jù)。GET的數(shù)據(jù)是在HTTP的頭部傳送的,而Post的數(shù)據(jù)那么是在HTTP請求的內(nèi)容里傳送。POST傳輸數(shù)據(jù)時,不需要在URL中顯示出來,而GET方法要在URL中顯示。GET方法由于受到URL長度的限制,只能傳遞大約1024字節(jié);POST傳輸?shù)臄?shù)據(jù)量大,可以到達2M。HTTPGET例如<html><body><formaction="login.jsp"

method="get">

用戶名:<inputtype="text"name="username"><br>

密碼:<inputtype="password"name="psd"maxlength=6><br><inputtype="submit"value="提交"><inputtype="reset"value="重填"></form></body></html>跳轉(zhuǎn)到數(shù)據(jù)處理頁面(html/jsp/aspx/php…)get方法提交數(shù)據(jù)會在URL中顯示注意要用name屬性才能在地址欄中顯示頁面和參數(shù)之間用?連接參數(shù)之間用&連接【返回】11.2HTTP編程越來越多的Java應用程序需要直接通過HTTP協(xié)議來訪問網(wǎng)絡資源。在JDK的包中已經(jīng)提供了訪問HTTP協(xié)議的根本功能:HttpURLConnection。但是對于大局部應用程序來說,JDK庫本身提供的功能還不夠豐富和靈活。除此之外,在Android系統(tǒng)中,AndroidSDK集成了Apache的HttpClient模塊,用來提供高效的、功能豐富的支持HTTP協(xié)議工具包,并且它支持HTTP協(xié)議最新的版本和建議。使用HttpClient可以快速開發(fā)出功能強大的HTTP程序。HTTP編程2種方法HttpURLConnection編程HttpClient編程【返回】1.HttpURLConnection編程〔以Post為例〕提交登錄數(shù)據(jù)給Web效勞器網(wǎng)站將結果反響給Android客戶端HttpURLConnection主要步驟〔以Post為例〕1)創(chuàng)立URL對象:StringUrl="格式的url地址串";//此處不帶參數(shù)URLurl=newURL(Url);2)通過HttpURLConnection創(chuàng)立連接對象:HttpURLConnectionconn=(HttpURLConnection)url.openConnection();需要強制轉(zhuǎn)換一下HttpURLConnection主要步驟〔以Post為例〕3)設置連接的幾個重要屬性:conn.setConnectTimeout(5000);//設置連接超時時間,如5秒conn.setRequestMethod("POST");//使用POST的方式conn.setDoOutput(true);//允許輸出輸入conn.setDoInput(true);//允許輸入conn.setUseCaches(false);//post方式最好不使用緩存conn.setRequestProperty("Charset","UTF-8");//設置編碼字符集UTF-8編碼用在網(wǎng)頁上可以在同一頁面顯示中文簡體繁體及其它語言〔如日文,韓文〕HttpURLConnection主要步驟〔以Post為例〕4)準備傳送的數(shù)據(jù),例如:Stringdatastr="username="+

URLEncoder.encode("wustzz","utf-8")+"&psd="+

URLEncoder.encode("123456","utf-8");byte[]data=datastr.getBytes();

將字符串編碼為utf-8格式將字符串轉(zhuǎn)化為適合物理層傳輸?shù)淖止?jié)流到時候這些值來自于文本框的輸入HttpURLConnection主要步驟〔以Post為例〕5)傳送數(shù)據(jù)給效勞器:以流的方式DataOutputStreamoutputStream=newDataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();//刷新outputStream.close();//關閉這里的操作都是Java標準的的I/OHttpURLConnection主要步驟〔以Post為例〕6)接收效勞器響應數(shù)據(jù):以流的方式BufferedReaderreader=newBufferedReader(newInputStreamReader(conn.getInputStream()));StringresultData="";//存放從效勞器返回的信息Stringline=null;while((line=reader.readLine())!=null){//使用循環(huán)體來獲得數(shù)據(jù)resultData+=line+"\n";}reader.close();//關閉這里的操作都是Java標準的的I/OAndroid客戶端可以用一個TextView顯示一下resultData第6步之前可加一個判斷請求是否成功處理:int

reponseCode=conn.getResponseCode();if(response==HttpURLConnection.HTTP_OK){第6步代碼}(1)效勞器端的準備MyEclipse中創(chuàng)立一個Web工程,命名為了“MyServer〞。兩個JSP網(wǎng)頁:index.jsp和login.jspindex.jsp主要代碼<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><body><formaction="login.jsp"method="get">用戶名:<inputtype="text"name="username"><br>密碼:<inputtype="password"name="psd"maxlength=6><br><inputtype="submit"value="提交"><inputtype="reset"value="重填"></form></body>提醒:(1)將jsp文件保存為utf-8格式(2)將頁面pageEncoding改為="utf-8"附:如何將文件保存為utf-8jsp文件右鍵->Propertylogin.jsp主要代碼<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><body><%Stringusername=request.getParameter("username");Stringpsd=request.getParameter("psd");if(username.equals("wustzz")&&psd.equals("123456")){out.print("登錄成功!歡送"+username);}else{out.print("登錄失??!");}%></body>運行網(wǎng)站index.jsp網(wǎng)站地址:://:8080/MyServer/其中指本地機,一般用來測試使用,也可用localhost代替8080:Web效勞器端口號login.jsp(2)Android客戶端準備工作:AndroidManifest.xml中添加訪問權限:<uses-permissionandroid:name="android.permission.INTERNET"/>Android4.0不推薦在主線程中使用HttpURLConnection(不平安),因此如要強制使用,那么需在onCreate中添加代碼:StrictMode.ThreadPolicypolicy=newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);由于Android模擬器已將指定給自己了,因此要訪問本機的效勞器,用它設定的另一個地址:很重要這兩句需要android:minSdkVersion="9"配合主界面<LinearLayoutxmlns:android="://schemas.android/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><EditTextandroid:id="@+id/editText1"android:hint="請輸入用戶名"android:layout_width="match_parent"android:layout_height="wrap_content"><requestFocus/></EditText><EditTextandroid:id="@+id/editText2"android:hint="請輸入密碼"android:layout_width="match_parent"android:layout_height="wrap_content"/>

<Buttonandroid:id="@+id/button1"android:layout_width="110dp"android:layout_height="wrap_content"android:layout_gravity="right"android:text="登錄"/><TextViewandroid:id="@+id/textView1"android:textSize="10px"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="結果"/></LinearLayout>MainActivity主要代碼protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//在主線程中強制使用子線程StrictMode.ThreadPolicypolicy=newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);Buttonbt=(Button)findViewById(R.id.button1);bt.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){StringUrl="://:8080/MyServer/login.jsp";URLurl=null;try{url=newURL(Url);}catch(MalformedURLExceptione1){Toast.makeText(getApplicationContext(),"無法創(chuàng)立URL",Toast.LENGTH_SHORT).show();}創(chuàng)立URL對象(需要try/catch)注意效勞器地址為:8080MainActivity主要代碼(續(xù))if(url!=null){HttpURLConnectionconn;try{

conn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(3000);//設置連接超時時間

conn.setRequestMethod("POST");//Post方式conn.setDoOutput(true);//設置能輸出conn.setDoInput(true);//設置能輸入conn.setUseCaches(false);//不使用緩存conn.setRequestProperty("Charset","UTF-8");//設置uft-8字符集創(chuàng)立連接對象并設置相關屬性I/O操作也要try/catchMainActivity主要代碼(續(xù))//準備要傳送給效勞器的數(shù)據(jù)Stringusername=((EditText)findViewById(R.id.editText1)).getText().toString();Stringpassword=((EditText)findViewById(R.id.editText2)).getText().toString();Stringdatastr="username="+URLEncoder.encode(username,"utf-8")+"&psd="+URLEncoder.encode(password,"utf-8");byte[]data=datastr.getBytes();準備要傳送的數(shù)據(jù)MainActivity主要代碼(續(xù))//向效勞器發(fā)送數(shù)據(jù)DataOutputStreamoutputStream=newDataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();//刷新outputStream.close();//關閉//接收效勞器返回的信息BufferedReaderreader=newBufferedReader(newInputStreamReader(conn.getInputStream()));StringresultData="";Stringline=null;//使用循環(huán)體來獲得數(shù)據(jù)while((line=reader.readLine())!=null){resultData+=line+"\n";}reader.close();//關閉發(fā)送數(shù)據(jù)給效勞器接收效勞器返回的信息效勞器返回的信息存放在resultData變量中MainActivity主要代碼//用一個TextView來顯示數(shù)據(jù)TextViewtv=(TextView)findViewById(R.id.textView1);f(!resultData.equals("")){

tv.setText(resultData);}else{

tv.setText("讀取的內(nèi)容為null");}}catch(IOExceptione){e.printStackTrace();Toast.makeText(getApplicationContext(),"出錯了!",Toast.LENGTH_SHORT).show();}}//endif(url!=null)}//endtry});//endonclick}//endoncreate顯示效勞器返回的信息運行情況效勞器返回的信息是一個完整的頁面先確認網(wǎng)站已啟動(Web效勞器)然后再運行Android客戶端改進一下效勞器返回信息去掉html內(nèi)容,只保存login.jsp中Java代碼局部:<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%><%Stringusername=request.getParameter("username");Stringpsd=request.getParameter("psd");if(username.equals("wustzz")&&psd.equals("123456")){out.print("登錄成功!歡送"+username);}else{out.print("登錄失敗!");}%>重新運行【返回】2.HttpClient編程提交登錄數(shù)據(jù)給Web效勞器網(wǎng)站將結果反響給Android客戶端效勞器端不變用HttpClient編程實現(xiàn)HttpClient主要步驟〔以Post為例〕1)創(chuàng)立HttpClient實例:HttpClientClient=newDefaultHttpClient();2)創(chuàng)立HttpPost請求對象:StringUrl="格式的url地址串";//此處不帶參數(shù)HttpPostPost=newHttpPost(Url);HttpClient主要步驟〔以Post為例〕3)設置需要傳遞的參數(shù)://(1)創(chuàng)立參數(shù)ArrayList<NameValuePair>params=newArrayList<NameValuePair>();params.add(newBasicNameValuePair("username","wustzz"));params.add(newBasicNameValuePair("psd","123456"));//(2)對參數(shù)進行utf-8編碼UrlEncodedFormEntityentity=newUrlEncodedFormEntity(params,"utf-8");//(3)將編碼的參數(shù)設置給HttpPost對象Post.setEntity(entity);參數(shù)名參數(shù)值HttpClient主要步驟〔以Post為例〕4)發(fā)出POST請求并獲取效勞器反響:HttpResponseresponse=Client.execute(Post);5)獲取效勞器返回的內(nèi)容:Stringresult="";//判斷請求是否成功處理if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){//獲取返回的內(nèi)容result=EntityUtils.toString(response.getEntity(),"utf-8");}使用EntityUtils工具將Entity轉(zhuǎn)換為uft-8編碼的字符串HttpClient主要步驟〔以Post為例〕6)關閉HttpClient以確保釋放所有占用的系統(tǒng)資源:Client.getConnectionManager().shutdown();Android客戶端準備工作:AndroidManifest.xml中添加訪問權限:<uses-permissionandroid:name="android.permission.INTERNET"/>Android4.0不推薦在主線程中使用HttpURLConnection(不平安),因此如要強制使用,那么需在onCreate中添加代碼:StrictMode.ThreadPolicypolicy=newStrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);由于Android模擬器已將指定給自己了,因此要訪問本機的效勞器,用它設定的另一個地址:很重要這兩句需要android:minSdkVersion="9"配合效勞器端沒有變化,因此只需設計Android客戶端代碼MainActivity主要代碼protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState););StrictMode.ThreadPolicypolicy=new

().permitAll().build();StrictMode.setThreadPolicy(policy);Buttonbt=(Button)findViewById(R.id.button1);bt.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){MainActivity主要代碼(續(xù))HttpClientClient=newDefaultHttpClient();StringUrl="://:8080/MyServer/login.jsp";//此處不帶參數(shù)HttpPostPost=newHttpPost(Url);

//(1)創(chuàng)立參數(shù)Stringusername=((EditText)findViewById(R.id.editText1)).getText().toString();Stringpassword=((EditText)findViewById(R.id.editText2)).getText().toString();ArrayList<NameValuePair>params=newArrayList<NameValuePair>();params.add(newBasicNameValuePair("username",username));params.add(newBasicNameValuePair("psd",password));try{//(2)對參數(shù)進行URL編碼UrlEncodedFormEntityentity=newUrlEncodedFormEntity(params,"utf-8");//(3)將編碼的參數(shù)設置給HttpPost對象Post.setEntity(entity);MainActivity主要代碼(續(xù))HttpResponseresponse=Client.execute(Post);Stringresult="";if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){result=EntityUtils.toString(response.getEntity(),"utf-8");//獲取返回的內(nèi)容}else{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論