您所在的位置:移动开发 > 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. Android之手机振动的设置
  2. Android通过HttpURLConnection上传多个文件至服务器 - 流传输
  3. androidの获取android手机信息
  4. android获取手机已经安装的app信息
  5. Android SDK中国在线更新镜像服务器 解决GOOGLE更新无法下载 更
  6. Android share绘制虚线在手机上显示实线问题
  7. Android中手机声音调节步骤(Android学习随笔四)
  8. Android沉浸式状态栏和手机虚拟按钮不兼容冲突的
  9. Android 实现蓝牙客户端与服务器端通信

随机推荐

  1. 初学Andriod之跑马灯属性设置
  2. android webview 截图快照
  3. activity跳转闪现黑屏
  4. android 输入法出现挤压屏幕
  5. android使用CheckedTextView搭配listview
  6. android ListView SimpleAdapter 带图片
  7. Android--取出SDcard卡上指定后缀名的文
  8. Android(安卓)Studio Gradle相关异常记录
  9. Android(安卓)Broadcast(广播)简单样例
  10. Android连续点击两次返回键退出App