用Android搭建客户端 手机和服务器交互开发实例

移动开发 Android
本文介绍了如何使用Android搭建客户端,实现手机和服务器的交互。让我们了解如何采用SSH框架,把服务器端的信息用JSON的形式发送到手机端。

笔者以前是学的Java EE,由于项目需要要开发Android,所以临时补了一个多星期,主要是手机端和服务器端交互,双向开发的。

首先在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以我就用装了一个JSON插件。这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端。以下是代码:

首先,在服务器端搭建好SSH框架,具体细节就不在陈述。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

手机端的代码如下:

首先,手机端有一个缓存类,主要用于缓存一些手机端需要访问的数据,这样的好处是可以达达节省手机和服务器的交互,用单例实现的:

  1. packagecom.jclick.cache;  
  2.  
  3. importcom.jclick.bean.User;  
  4.  
  5. publicclassCache{  
  6.  
  7. privateUserUser;  
  8.  
  9. privateCache(){  
  10.  
  11. }  
  12. /**构造单例*/ 
  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.     /**构造单例*/ 
  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.  

接着开始书写手机端的协议,用户向服务器发送请求,同时服务器反馈给手机端信息的:

  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. *向服务器端发送请求  
  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. *得到返回数据  
  47. *  
  48. *@paramurl  
  49. *@return  
  50. *@throwsException  
  51. */ 
  52. protectedvoidparse()throwsException{  
  53. //TODO状态处理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. *向服务器发送信息  
  67. *  
  68. *@paramkey  
  69. *@paramvalue  
  70. */ 
  71. publicvoidaddNameValuePair(Stringkey,Stringvalue){  
  72. nameValuePair.add(newBasicNameValuePair(key,value));  
  73. }  
  74.  
  75. /**  
  76. *返回JSONObject对象数据模型  
  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.     *向服务器端发送请求  
  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.     *得到返回数据  
  133.     *  
  134.     *@paramurl  
  135.     *@return  
  136.     *@throwsException  
  137.     */ 
  138.     protectedvoidparse()throwsException{  
  139.         //TODO状态处理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.     *向服务器发送信息  
  153.     *  
  154.     *@paramkey  
  155.     *@paramvalue  
  156.     */ 
  157.     publicvoidaddNameValuePair(Stringkey,Stringvalue){  
  158.         nameValuePair.add(newBasicNameValuePair(key,value));  
  159.     }  
  160.  
  161.     /**  
  162.     *返回JSONObject对象数据模型  
  163.     *  
  164.     *@return  
  165.     *@throwsJSONException  
  166.     */ 
  167.     publicJSONObjectgetJSON()throwsJSONException{  
  168.         returnnewJSONObject(sb.toString());  
  169.     }  
  170.  

接着是登陆协议,在这里我只是模拟登陆使用的一个类,仅供大家参考:

  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实体类,主要用于保存用户信息: 

  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里边判断登陆的代码了,详细代码不再贴出来了,仅贴一个判断登陆的代码:

  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.         } 

以上代码为了跟大家分享一下,感觉手机端和服务器双向开发非常过瘾。同时对Android的兴趣大大提升,它也没有我们想象中的那么难。 

【编辑推荐】

  1. Android SDK工具:使用layoutopt进行布局优化
  2. 开发者评判Android 3.0 SDK的优点与不足
  3. 谷歌官方文档:Android API之数据储存
  4. Android Widget设计指南
  5. Android用户界面设计模板Dashboard反例展示
责任编辑:佚名 来源: JavaEye
相关推荐

2012-05-07 13:55:41

JavaJava Web

2018-12-20 08:50:53

TCPIP服务器

2010-01-11 13:05:24

VNC server配

2018-04-12 10:55:41

Android服务器数据

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代理服务器web服务器

2021-06-16 07:34:32

Pythonsocket库Python基础

2021-10-14 08:39:17

Java Netty Java 基础

2018-01-12 09:20:55

2011-06-09 10:51:26

Qt 服务器 客户端

2009-08-18 12:51:19

服务器+客户端

2022-06-14 15:07:04

IPC客户端服务端

2010-08-26 10:01:50

DHCP服务器

2018-12-18 10:47:37

2018-07-17 09:59:10

PythonUDP服务器

2009-09-16 16:09:41

NIS服务器客户端NIS

2019-08-28 15:19:15

PythonTCP服务器

2009-12-25 10:47:17

DNS服务器
点赞
收藏

51CTO技术栈公众号