自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用Android搭建客戶端 手機(jī)和服務(wù)器交互開發(fā)實(shí)例

移動(dòng)開發(fā) Android
本文介紹了如何使用Android搭建客戶端,實(shí)現(xiàn)手機(jī)和服務(wù)器的交互。讓我們了解如何采用SSH框架,把服務(wù)器端的信息用JSON的形式發(fā)送到手機(jī)端。

筆者以前是學(xué)的Java EE,由于項(xiàng)目需要要開發(fā)Android,所以臨時(shí)補(bǔ)了一個(gè)多星期,主要是手機(jī)端和服務(wù)器端交互,雙向開發(fā)的。

首先在服務(wù)器端,我采用的是SSH框架,struts 2集合了JSON插件,服務(wù)器和客戶端的信息交互采用的JSON來傳輸,由于在服務(wù)器端用了Struts 2,所以我就用裝了一個(gè)JSON插件。這樣,很輕易的就把服務(wù)器端的信息用JSON的形式發(fā)送到了手機(jī)端。以下是代碼:

首先,在服務(wù)器端搭建好SSH框架,具體細(xì)節(jié)就不在陳述。struts.xml配置如下:

  1. <packagename="login"extends="json-default">  
  2. <actionname="login"class="com.jclick.test.LoginAction"method="login">  
  3. <resulttype="json"><paramname="includeProperties">result</param></result>  
  4. </action>  
  5. </package>  
  6.  
  7.     <packagename="login"extends="json-default">  
  8.     <actionname="login"class="com.jclick.test.LoginAction"method="login">  
  9.     <resulttype="json"><paramname="includeProperties">result</param></result>  
  10.     </action>  
  11.     </package

手機(jī)端的代碼如下:

首先,手機(jī)端有一個(gè)緩存類,主要用于緩存一些手機(jī)端需要訪問的數(shù)據(jù),這樣的好處是可以達(dá)達(dá)節(jié)省手機(jī)和服務(wù)器的交互,用單例實(shí)現(xiàn)的:

  1. packagecom.jclick.cache;  
  2.  
  3. importcom.jclick.bean.User;  
  4.  
  5. publicclassCache{  
  6.  
  7. privateUserUser;  
  8.  
  9. privateCache(){  
  10.  
  11. }  
  12. /**構(gòu)造單例*/ 
  13. privatestaticclassCacheHolder{  
  14. privatestaticfinalCacheINSTANCE=newCache();  
  15. }  
  16. publicCachegetInstance(){  
  17. returnCacheHolder.INSTANCE;  
  18. }  
  19. publicUsergetUser(){  
  20. returnUser;  
  21. }  
  22. publicvoidsetUser(UserUser){  
  23. this.User=User;  
  24. }  
  25.  
  26. }  
  27.  
  28. packagecom.jclick.cache;  
  29.  
  30. importcom.jclick.bean.User;  
  31.  
  32. publicclassCache{  
  33.       
  34.     privateUserUser;  
  35.       
  36.     privateCache(){  
  37.           
  38.     }  
  39.     /**構(gòu)造單例*/ 
  40.     privatestaticclassCacheHolder{  
  41.         privatestaticfinalCacheINSTANCE=newCache();  
  42.     }  
  43.     publicCachegetInstance(){  
  44.         returnCacheHolder.INSTANCE;  
  45.     }  
  46.     publicUsergetUser(){  
  47.         returnUser;  
  48.     }  
  49.     publicvoidsetUser(UserUser){  
  50.         this.User=User;  
  51.     }  
  52.  

接著開始書寫手機(jī)端的協(xié)議,用戶向服務(wù)器發(fā)送請求,同時(shí)服務(wù)器反饋給手機(jī)端信息的:

  1. packagecom.jclick.protocol;  
  2.  
  3. importjava.io.BufferedReader;  
  4. importjava.io.InputStreamReader;  
  5. importjava.util.ArrayList;  
  6. importjava.util.List;  
  7.  
  8. importorg.apache.http.HttpResponse;  
  9. importorg.apache.http.NameValuePair;  
  10. importorg.apache.http.client.HttpClient;  
  11. importorg.apache.http.client.entity.UrlEncodedFormEntity;  
  12. importorg.apache.http.client.methods.HttpPost;  
  13. importorg.apache.http.impl.client.DefaultHttpClient;  
  14. importorg.apache.http.message.BasicNameValuePair;  
  15. importorg.json.JSONException;  
  16. importorg.json.JSONObject;  
  17.  
  18. publicclassBaseProtocol{  
  19. privateStringBuildersb=newStringBuilder();  
  20.  
  21. privateHttpClienthttpClient;  
  22. privateHttpPosthttpRequest;  
  23. privateHttpResponseresponse;  
  24.  
  25. privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();  
  26.  
  27. BaseProtocol(){  
  28. httpClient=newDefaultHttpClient();  
  29. }  
  30.  
  31. /**  
  32. *向服務(wù)器端發(fā)送請求  
  33. *  
  34. *@paramurl  
  35. *@throwsException  
  36. */ 
  37. protectedvoidpack(Stringurl)throwsException{  
  38. httpClient=newDefaultHttpClient();  
  39. httpRequest=newHttpPost(url);  
  40.  
  41. httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));  
  42. response=httpClient.execute(httpRequest);  
  43. }  
  44.  
  45. /**  
  46. *得到返回?cái)?shù)據(jù)  
  47. *  
  48. *@paramurl  
  49. *@return  
  50. *@throwsException  
  51. */ 
  52. protectedvoidparse()throwsException{  
  53. //TODO狀態(tài)處理500200  
  54. if(response.getStatusLine().getStatusCode()==200){  
  55.  
  56. BufferedReaderbufferedReader2=newBufferedReader(  
  57. newInputStreamReader(response.getEntity().getContent()));  
  58. for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2  
  59. .readLine()){  
  60. sb.append(s);  
  61. }  
  62. }  
  63. }  
  64.  
  65. /**  
  66. *向服務(wù)器發(fā)送信息  
  67. *  
  68. *@paramkey  
  69. *@paramvalue  
  70. */ 
  71. publicvoidaddNameValuePair(Stringkey,Stringvalue){  
  72. nameValuePair.add(newBasicNameValuePair(key,value));  
  73. }  
  74.  
  75. /**  
  76. *返回JSONObject對象數(shù)據(jù)模型  
  77. *  
  78. *@return  
  79. *@throwsJSONException  
  80. */ 
  81. publicJSONObjectgetJSON()throwsJSONException{  
  82. returnnewJSONObject(sb.toString());  
  83. }  
  84.  
  85. }  
  86.  
  87. packagecom.jclick.protocol;  
  88.  
  89. importjava.io.BufferedReader;  
  90. importjava.io.InputStreamReader;  
  91. importjava.util.ArrayList;  
  92. importjava.util.List;  
  93.  
  94. importorg.apache.http.HttpResponse;  
  95. importorg.apache.http.NameValuePair;  
  96. importorg.apache.http.client.HttpClient;  
  97. importorg.apache.http.client.entity.UrlEncodedFormEntity;  
  98. importorg.apache.http.client.methods.HttpPost;  
  99. importorg.apache.http.impl.client.DefaultHttpClient;  
  100. importorg.apache.http.message.BasicNameValuePair;  
  101. importorg.json.JSONException;  
  102. importorg.json.JSONObject;  
  103.  
  104. publicclassBaseProtocol{  
  105.     privateStringBuildersb=newStringBuilder();  
  106.  
  107.     privateHttpClienthttpClient;  
  108.     privateHttpPosthttpRequest;  
  109.     privateHttpResponseresponse;  
  110.  
  111.     privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();  
  112.  
  113.     BaseProtocol(){  
  114.         httpClient=newDefaultHttpClient();  
  115.     }  
  116.  
  117.     /**  
  118.     *向服務(wù)器端發(fā)送請求  
  119.     *  
  120.     *@paramurl  
  121.     *@throwsException  
  122.     */ 
  123.     protectedvoidpack(Stringurl)throwsException{  
  124.         httpClient=newDefaultHttpClient();  
  125.         httpRequest=newHttpPost(url);  
  126.  
  127.         httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));  
  128.         response=httpClient.execute(httpRequest);  
  129.     }  
  130.  
  131.     /**  
  132.     *得到返回?cái)?shù)據(jù)  
  133.     *  
  134.     *@paramurl  
  135.     *@return  
  136.     *@throwsException  
  137.     */ 
  138.     protectedvoidparse()throwsException{  
  139.         //TODO狀態(tài)處理500200  
  140.         if(response.getStatusLine().getStatusCode()==200){  
  141.  
  142.             BufferedReaderbufferedReader2=newBufferedReader(  
  143.                     newInputStreamReader(response.getEntity().getContent()));  
  144.             for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2  
  145.                     .readLine()){  
  146.                 sb.append(s);  
  147.             }  
  148.         }  
  149.     }  
  150.  
  151.     /**  
  152.     *向服務(wù)器發(fā)送信息  
  153.     *  
  154.     *@paramkey  
  155.     *@paramvalue  
  156.     */ 
  157.     publicvoidaddNameValuePair(Stringkey,Stringvalue){  
  158.         nameValuePair.add(newBasicNameValuePair(key,value));  
  159.     }  
  160.  
  161.     /**  
  162.     *返回JSONObject對象數(shù)據(jù)模型  
  163.     *  
  164.     *@return  
  165.     *@throwsJSONException  
  166.     */ 
  167.     publicJSONObjectgetJSON()throwsJSONException{  
  168.         returnnewJSONObject(sb.toString());  
  169.     }  
  170.  

接著是登陸協(xié)議,在這里我只是模擬登陸使用的一個(gè)類,僅供大家參考:

  1. packagecom.jclick.protocol;  
  2.  
  3. importorg.json.JSONObject;  
  4.  
  5. importcom.jclick.bean.User;  
  6.  
  7. publicclassLoginProtocolextendsBaseProtocol{  
  8.  
  9. privatefinalstaticStringURL="http://localhost:8080/test/login";  
  10.  
  11. publicbooleancheckLogin(Userusr){  
  12. try{  
  13. pack(URL);  
  14. parse();  
  15. JSONObjectobj=this.getJSON();  
  16. if(obj.getString("result").equals("failed")){  
  17. returnfalse;  
  18. }else{  
  19. returntrue;  
  20. }  
  21. }catch(Exceptione){  
  22. e.printStackTrace();  
  23. returnfalse;  
  24. }  
  25. }  
  26.  
  27. }  
  28.  
  29. packagecom.jclick.protocol;  
  30.  
  31. importorg.json.JSONObject;  
  32.  
  33. importcom.jclick.bean.User;  
  34.  
  35. publicclassLoginProtocolextendsBaseProtocol{  
  36.       
  37.     privatefinalstaticStringURL="http://localhost:8080/test/login";  
  38.       
  39.     publicbooleancheckLogin(Userusr){  
  40.         try{  
  41.             pack(URL);  
  42.             parse();  
  43.             JSONObjectobj=this.getJSON();  
  44.             if(obj.getString("result").equals("failed")){  
  45.                 returnfalse;  
  46.             }else{  
  47.                 returntrue;  
  48.             }  
  49.         }catch(Exceptione){  
  50.             e.printStackTrace();  
  51.             returnfalse;  
  52.         }  
  53.     }  
  54.  

然后是User實(shí)體類,主要用于保存用戶信息: 

  1. packagecom.jclick.bean;  
  2.  
  3. publicclassUser{  
  4. privateStringusername;  
  5. privateStringpassword;  
  6. publicStringgetUsername(){  
  7. returnusername;  
  8. }  
  9. publicvoidsetUsername(Stringusername){  
  10. this.username=username;  
  11. }  
  12. publicStringgetPassword(){  
  13. returnpassword;  
  14. }  
  15. publicvoidsetPassword(Stringpassword){  
  16. this.password=password;  
  17. }  
  18.  
  19. }  
  20.  
  21. packagecom.jclick.bean;  
  22.  
  23. publicclassUser{  
  24.     privateStringusername;  
  25.     privateStringpassword;  
  26.     publicStringgetUsername(){  
  27.         returnusername;  
  28.     }  
  29.     publicvoidsetUsername(Stringusername){  
  30.         this.username=username;  
  31.     }  
  32.     publicStringgetPassword(){  
  33.         returnpassword;  
  34.     }  
  35.     publicvoidsetPassword(Stringpassword){  
  36.         this.password=password;  
  37.     }  
  38.  

最后就是LoginActivity里邊判斷登陸的代碼了,詳細(xì)代碼不再貼出來了,僅貼一個(gè)判斷登陸的代碼:

  1. privatevoidcheckedData(){  
  2. username=((EditText)findViewById(R.id.username)).getText().toString();  
  3. password=((EditText)findViewById(R.id.password)).getText().toString();  
  4.  
  5. Useruser=newUser();  
  6. user.setUsername(username);  
  7. user.setPassword(password);  
  8. LoginProtocollogin=newLoginProtocol();  
  9. booleanresult=login.checkLogin(user);  
  10.  
  11. if(result){SpiderCache.getInstance().setUserSession(user);  
  12. Toast.makeText(getApplicationContext(),"登錄成功",1000).show();  
  13. Intentintent=newIntent();  
  14. intent.setClass(LoginActivity.this,WelcomeActivity.class);  
  15. startActivity(intent);  
  16. }else{Toast.makeText(LoginActivity.this,"密碼或用戶名不匹配,請重新輸入!",1000).show();  
  17. }  
  18. }  
  19.  
  20.         privatevoidcheckedData(){  
  21.             username=((EditText)findViewById(R.id.username)).getText().toString();  
  22.             password=((EditText)findViewById(R.id.password)).getText().toString();  
  23.               
  24.             Useruser=newUser();  
  25.             user.setUsername(username);  
  26.             user.setPassword(password);  
  27.             LoginProtocollogin=newLoginProtocol();  
  28.             booleanresult=login.checkLogin(user);  
  29.               
  30.             if(result){             SpiderCache.getInstance().setUserSession(user);  
  31.                 Toast.makeText(getApplicationContext(),"登錄成功",1000).show();  
  32.                 Intentintent=newIntent();  
  33.                 intent.setClass(LoginActivity.this,WelcomeActivity.class);  
  34.                 startActivity(intent);  
  35.             }else{              Toast.makeText(LoginActivity.this,"密碼或用戶名不匹配,請重新輸入!",1000).show();  
  36.             }  
  37.         } 

以上代碼為了跟大家分享一下,感覺手機(jī)端和服務(wù)器雙向開發(fā)非常過癮。同時(shí)對Android的興趣大大提升,它也沒有我們想象中的那么難。 

【編輯推薦】

  1. Android SDK工具:使用layoutopt進(jìn)行布局優(yōu)化
  2. 開發(fā)者評判Android 3.0 SDK的優(yōu)點(diǎn)與不足
  3. 谷歌官方文檔:Android API之?dāng)?shù)據(jù)儲存
  4. Android Widget設(shè)計(jì)指南
  5. Android用戶界面設(shè)計(jì)模板Dashboard反例展示
責(zé)任編輯:佚名 來源: JavaEye
相關(guān)推薦

2012-05-07 13:55:41

JavaJava Web

2018-12-20 08:50:53

TCPIP服務(wù)器

2010-01-11 13:05:24

VNC server配

2018-04-12 10:55:41

Android服務(wù)器數(shù)據(jù)

2010-03-01 16:10:32

Linux Samba

2010-03-19 09:26:34

Java Socket

2018-11-19 15:30:23

ChronyLinux命令

2009-02-12 15:51:00

squid代理服務(wù)器web服務(wù)器

2021-06-16 07:34:32

Pythonsocket庫Python基礎(chǔ)

2021-10-14 08:39:17

Java Netty Java 基礎(chǔ)

2018-01-12 09:20:55

2011-06-09 10:51:26

Qt 服務(wù)器 客戶端

2009-08-18 12:51:19

服務(wù)器+客戶端

2022-06-14 15:07:04

IPC客戶端服務(wù)端

2010-08-26 10:01:50

DHCP服務(wù)器

2018-12-18 10:47:37

2018-07-17 09:59:10

PythonUDP服務(wù)器

2009-12-25 10:47:17

DNS服務(wù)器

2019-08-28 15:19:15

PythonTCP服務(wù)器

2009-09-16 16:09:41

NIS服務(wù)器客戶端NIS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號