admin 管理员组

文章数量: 887021


2024年1月19日发(作者:应届生python工资)

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

AD:

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

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

首先,在服务器端搭建好SSH框架,具体细节就不在陈述。配置如下:

1.

2.

3.

4.

5.

6.

7.

8.

9.

result

result

10.

11.

手机端的代码如下:

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

1.

2.

3.

4.

5.

6.

7.

8.

9.

;

;

publicclassCache{

privateUserUser;

privateCache(){

10.

11. }

12. /**构造单例*/

13. privatestaticclassCacheHolder{

14. privatestaticfinalCacheINSTANCE=newCache();

15. }

16. publicCachegetInstance(){

17. CE;

18. }

19. publicUsergetUser(){

20. returnUser;

21. }

22. publicvoidsetUser(UserUser){

23. =User;

24. }

25.

26. }

27.

28. ;

29.

30. ;

31.

32. publicclassCache{

33.

34. privateUserUser;

35.

36. privateCache(){

37.

38. }

39. /**构造单例*/

40. privatestaticclassCacheHolder{

41. privatestaticfinalCacheINSTANCE=newCache();

42. }

43. publicCachegetInstance(){

44. CE;

45. }

46. publicUsergetUser(){

47. returnUser;

48. }

49. publicvoidsetUser(UserUser){

50. =User;

51. }

52.

53. }

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

1.

2.

3.

4.

5.

6.

7.

8.

9.

ol;

edReader;

treamReader;

ist;

;

sponse;

luePair;

10. ient;

11. odedFormEntity;

12. st;

13. tHttpClient;

14. ameValuePair;

15. ception;

16. ject;

17.

18. publicclassBaseProtocol{

19. privateStringBuildersb=newStringBuilder();

20.

21. privateHttpClienthttpClient;

22. privateHttpPosthttpRequest;

23. privateHttpResponseresponse;

24.

25. privateListnameValuePair=newArrayList();

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. ity(newUrlEncodedFormEntity(nameValuePair));

42. response=e(httpRequest);

43. }

44.

45. /**

46. *得到返回数据

47. *

48. *@paramurl

49. *@return

50. *@throwsException

51. */

52. protectedvoidparse()throwsException{

53. //TODO状态处理500200

54. if(tusLine().getStatusCode()==200){

55.

56. BufferedReaderbufferedReader2=newBufferedReader(

57. newInputStreamReader(ity().getContent()));

58. for(Strings=ne();s!=null;s=bufferedReader2

59. .readLine()){

60. (s);

61. }

62. }

63. }

64.

65. /**

66. *向服务器发送信息

67. *

68. *@paramkey

69. *@paramvalue

70. */

71. publicvoidaddNameValuePair(Stringkey,Stringvalue){

72. (newBasicNameValuePair(key,value));

73. }

74.

75. /**

76. *返回JSONObject对象数据模型

77. *

78. *@return

79. *@throwsJSONException

80. */

81. publicJSONObjectgetJSON()throwsJSONException{

82. returnnewJSONObject(ng());

83. }

84.

85. }

86.

87. ol;

88.

89. edReader;

90. treamReader;

91. ist;

92. ;

93.

94. sponse;

95. luePair;

96. ient;

97. odedFormEntity;

98. st;

99. tHttpClient;

100. ameValuePair;

101. ception;

102. ject;

103.

104. publicclassBaseProtocol{

105. privateStringBuildersb=newStringBuilder();

106.

107. privateHttpClienthttpClient;

108. privateHttpPosthttpRequest;

109. privateHttpResponseresponse;

110.

111. privateListnameValuePair=newArrayList();

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. ity(newUrlEncodedFormEntity(nameValuePair));

128. response=e(httpRequest);

129. }

130.

131. /**

132. *得到返回数据

133. *

134. *@paramurl

135. *@return

136. *@throwsException

137. */

138. protectedvoidparse()throwsException{

139. //TODO状态处理500200

140. if(tusLine().getStatusCode()==200){

141.

142. BufferedReaderbufferedReader2=newBufferedReader(

143. newInputStreamReader(ity().getContent()));

144. for(Strings=ne();s!=null;s=bufferedReader2

145. .readLine()){

146. (s);

147. }

148. }

149. }

150.

151. /**

152. *向服务器发送信息

153. *

154. *@paramkey

155. *@paramvalue

156. */

157. publicvoidaddNameValuePair(Stringkey,Stringvalue){

158. (newBasicNameValuePair(key,value));

159. }

160.

161. /**

162. *返回JSONObject对象数据模型

163. *

164. *@return

165. *@throwsJSONException

166. */

167. publicJSONObjectgetJSON()throwsJSONException{

168. returnnewJSONObject(ng());

169. }

170.

171. }

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

1.

2.

3.

4.

5.

6.

7.

8.

9.

ol;

ject;

;

publicclassLoginProtocolextendsBaseProtocol{

privatefinalstaticStringURL="localhost:8080/test/login";

10.

11. publicbooleancheckLogin(Userusr){

12. try{

13. pack(URL);

14. parse();

15. JSONObjectobj=N();

16. if(ing("result").equals("failed")){

17. returnfalse;

18. }else{

19. returntrue;

20. }

21. }catch(Exceptione){

22. tackTrace();

23. returnfalse;

24. }

25. }

26.

27. }

28.

29. ol;

30.

31. ject;

32.

33. ;

34.

35. publicclassLoginProtocolextendsBaseProtocol{

36.

37. privatefinalstaticStringURL="localhost:8080/test/login";

38.

39. publicbooleancheckLogin(Userusr){

40. try{

41. pack(URL);

42. parse();

43. JSONObjectobj=N();

44. if(ing("result").equals("failed")){

45. returnfalse;

46. }else{

47. returntrue;

48. }

49. }catch(Exceptione){

50. tackTrace();

51. returnfalse;

52. }

53. }

54.

55. }

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

1.

2.

3.

4.

5.

6.

7.

8.

9.

;

publicclassUser{

privateStringusername;

privateStringpassword;

publicStringgetUsername(){

returnusername;

}

publicvoidsetUsername(Stringusername){

10. me=username;

11. }

12. publicStringgetPassword(){

13. returnpassword;

14. }

15. publicvoidsetPassword(Stringpassword){

16. rd=password;

17. }

18.

19. }

20.

21. ;

22.

23. publicclassUser{

24. privateStringusername;

25. privateStringpassword;

26. publicStringgetUsername(){

27. returnusername;

28. }

29. publicvoidsetUsername(Stringusername){

30. me=username;

31. }

32. publicStringgetPassword(){

33. returnpassword;

34. }

35. publicvoidsetPassword(Stringpassword){

36. rd=password;

37. }

38.

39. }

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

1.

2.

3.

4.

5.

6.

7.

8.

9.

privatevoidcheckedData(){

username=((EditText)findViewById(me)).getText().toString();

password=((EditText)findViewById(rd)).getText().toString();

Useruser=newUser();

rname(username);

sword(password);

LoginProtocollogin=newLoginProtocol();

booleanresult=ogin(user);

10.

11. if(result){tance().setUserSession(user);

12. xt(getApplicationContext(),"登录成功",1000).show();

13. Intentintent=newIntent();

14. ss(,);

15. startActivity(intent);

16. }else{xt(,"密码或用户名不匹配,请重新输入!",1000).show();

17. }

18. }

19.

20. privatevoidcheckedData(){

21. username=((EditText)findViewById(me)).getText().toString();

22. password=((EditText)findViewById(rd)).getText().toString();

23.

24. Useruser=newUser();

25. rname(username);

26. sword(password);

27. LoginProtocollogin=newLoginProtocol();

28. booleanresult=ogin(user);

29.

30. if(result){ tance().setUserSession(user);

31. xt(getApplicationContext(),"登录成功",1000).show();

32. Intentintent=newIntent();

33. ss(,);

34. startActivity(intent);

35. }else{ xt(,"密码或用户名不匹配,请重新输入!",1000).show();

36. }

37. }

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


本文标签: 手机 服务器 服务器端 信息 交互