您所在的位置:移动开发 > Android > 用Android搭建客户端 手机和服务器交互开发实例

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

2011-03-28 17:24 Jclick JavaEye 我要评论(11) 字号: T | T

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

AD:


笔者以前是学的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. <packagename="login"extends="json-default">
  7. <actionname="login"class="com.jclick.test.LoginAction"method="login">
  8. <resulttype="json"><paramname="includeProperties">result</param></result>
  9. </action>
  10. </package>

手机端的代码如下:

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

                
  1. packagecom.jclick.cache;
  2. importcom.jclick.bean.User;
  3. publicclassCache{
  4. privateUserUser;
  5. privateCache(){
  6. }
  7. /**构造单例*/
  8. privatestaticclassCacheHolder{
  9. privatestaticfinalCacheINSTANCE=newCache();
  10. }
  11. publicCachegetInstance(){
  12. returnCacheHolder.INSTANCE;
  13. }
  14. publicUsergetUser(){
  15. returnUser;
  16. }
  17. publicvoidsetUser(UserUser){
  18. this.User=User;
  19. }
  20. }
  21. packagecom.jclick.cache;
  22. importcom.jclick.bean.User;
  23. publicclassCache{
  24. privateUserUser;
  25. privateCache(){
  26. }
  27. /**构造单例*/
  28. privatestaticclassCacheHolder{
  29. privatestaticfinalCacheINSTANCE=newCache();
  30. }
  31. publicCachegetInstance(){
  32. returnCacheHolder.INSTANCE;
  33. }
  34. publicUsergetUser(){
  35. returnUser;
  36. }
  37. publicvoidsetUser(UserUser){
  38. this.User=User;
  39. }
  40. }

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

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

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

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

然后是User实体类,主要用于保存用户信息:

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

最后就是LoginActivity里边判断登陆的代码了,详细代码不再贴出来了,仅贴一个判断登陆的代码:

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

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


更多相关文章

  1. Google Android真实的谎言
  2. 【Android每周专题】网络编程
  3. Android通过HttpURLConnection上传多个文件至服务器 - 流传输
  4. Android之手机振动的设置
  5. androidの获取android手机信息
  6. android 调用系统应用
  7. Android(安卓)Studio安装app 报错的问题It is possible that thi
  8. android获取手机已经安装的app信息
  9. Android(安卓)SDK中国在线更新镜像服务器 解决GOOGLE更新无法下

随机推荐

  1. android debugkeystore about
  2. Android(安卓)Studio Gradle使用详解
  3. Android(安卓),测试支持库
  4. Cocos2d-x 3.0 TestCpp android编译出错
  5. Android把Bitmap保存为PNG图像文件的简单
  6. Android(安卓)开发入门-使用 Intent 在活
  7. android编辑时遇到:{"kind":"error","text
  8. Android检查手机上是否安装了第三方软件
  9. Android(安卓)kotlin 自定义View 旋转、
  10. Android(安卓)Zygote进程和SystemServer