Android中利用httpclient进行网络通信的方法(以用户登录为例说明)
http://www.android100.org/html/201406/09/22915.html
1.服务器端
服务器端和android没有太大关系,对J2EE比较熟悉的话写起来应该很容易,这里就不一一贴出代码。
首先在本地创建一个数据库表,其中包含了一个userinfo表用来存储用户信息。
需要实现的代码如下:
DBUtils:创建数据库连接对象
User实体类:用来存放用户信息
UserDao:用来对处理User相关的数据操作
UserService:调用UserDao来处理事务
UserServlet:处理用户请求,并返回
当客户端访问该servlet时,获得客户端传入的数据,处理数据,并将结果写到response中返回给客户端。
UserServlet中doPost方法如下:
[java] <span style="font-size:16px;">1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3 UserService us = UserService.getInstance();
4 String username = request.getParameter("username"); //获得从客户端传入的用户名和密码
5 String password = request.getParameter("password");
6 //System.out.println("username:"+username);
7 //System.out.println("password:"+password);
8 //response.setContentType("text/html");
9 PrintWriter out = response.getWriter();
10 if(us.login(username, password))
11 {
12 //用户登录成功!
13 out.println("success");
14 }
15 else //用户登录失败
16 out.println("failed");
17 out.flush();
18 out.close();
19 } </span>
<span style="font-size:16px;">1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3 UserService us = UserService.getInstance();
4 String username = request.getParameter("username"); //获得从客户端传入的用户名和密码
5 String password = request.getParameter("password");
6 //System.out.println("username:"+username);
7 //System.out.println("password:"+password);
8 //response.setContentType("text/html");
9 PrintWriter out = response.getWriter();
10 if(us.login(username, password))
11 {
12 //用户登录成功!
13 out.println("success");
14 }
15 else //用户登录失败
16 out.println("failed");
17 out.flush();
18 out.close();
19 } </span>
2.客户端,首先创建一个登录Activity。如图所示:

当用户点击登录按钮后,创建一个http请求,发送到服务器端。获得服务器返回的结果后,再进行判断并执行相关操作。
httpclient相当于一个浏览器,通过它,可以很方便的发出GET,POST请求。
该Activity的具体代码如下:
[java] <span style="font-size:16px;">20 public class GossipActivity extends Activity {
21 /** Called when the activity is first created. */
22
23 pivate EditText usernameEdit;
24 private EditText passwordEdit;
25 private Button loginButton;
26
27 @Override
28 public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.main);
31
32 usernameEdit = (EditText)findViewById(R.id.usernameEdit);
33 passwordEdit = (EditText)findViewById(R.id.pwdEdit);
34 loginButton = (Button)findViewById(R.id.loginButton);
35
36 loginButton.setOnClickListener(loginListener);
37 }
38
39 //登陆监听器
40 OnClickListener loginListener = new OnClickListener(){
41
42 @Override
43 public void onClick(View v) {
44 System.out.println("Login Button clicked!");
45 String httpUrl = "http://10.0.2.2:8089/Gossip/LoginServlet";
46 System.out.println(httpUrl);
47 HttpPost request = new HttpPost(httpUrl);
48 HttpClient httpClient = new DefaultHttpClient();
49 //传递参数
50 List<NameValuePair> params = new ArrayList<NameValuePair>();
51 params.add(new BasicNameValuePair("username",usernameEdit.getText().toString()));
52 params.add(new BasicNameValuePair("password",passwordEdit.getText().toString()));
53 HttpResponse response;
54 try {
55 HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
56 request.setEntity(entity);
57 response = httpClient.execute(request);
58
59 //如果返回状态为200,获得返回的结果
60 if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
61 String str = EntityUtils.toString(response.getEntity());
62 System.out.println("response:"+str);
63 if(str.trim().equals("success")){
64 //用户登录成功
65 System.out.println("登录成功!");
66 Intent intent = new Intent(GossipActivity.this,GossiplistActivity.class);
67 startActivity(intent);
68 }
69 else{
70 //用户登录失败
71 System.out.println("登录失败!");
72 }
73 }else{
74 System.out.println("连接失败!");
75 }
76 } catch (ClientProtocolException e) {
77 // TODO Auto-generated catch block
78 e.printStackTrace();
79 } catch (IOException e) {
80 // TODO Auto-generated catch block
81 e.printStackTrace();
82 }
83
84 }};
85 } </span>
<span style="font-size:16px;">20 public class GossipActivity extends Activity {
21 /** Called when the activity is first created. */
22
23 private EditText usernameEdit;
24 private EditText passwordEdit;
25 private Button loginButton;
26
27 @Override
28 public void onCreate(Bundle savedInstanceState) {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.main);
31
32 usernameEdit = (EditText)findViewById(R.id.usernameEdit);
33 passwordEdit = (EditText)findViewById(R.id.pwdEdit);
34 loginButton = (Button)findViewById(R.id.loginButton);
35
36 loginButton.setOnClickListener(loginListener);
37 }
38
39 //登陆监听器
40 OnClickListener loginListener = new OnClickListener(){
41
42 @Override
43 public void onClick(View v) {
44 System.out.println("Login Button clicked!");
45 String httpUrl = "http://10.0.2.2:8089/Gossip/LoginServlet";
46 System.out.println(httpUrl);
47 HttpPost request = new HttpPost(httpUrl);
48 HttpClient httpClient = new DefaultHttpClient();
49 //传递参数
50 List<NameValuePair> params = new ArrayList<NameValuePair>();
51 params.add(new BasicNameValuePair("username",usernameEdit.getText().toString()));
52 params.add(new BasicNameValuePair("password",passwordEdit.getText().toString()));
53 HttpResponse response;
54 try {
55 HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
56 request.setEntity(entity);
57 response = httpClient.execute(request);
58
59 //如果返回状态为200,获得返回的结果
60 if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
61 String str = EntityUtils.toString(response.getEntity());
62 System.out.println("response:"+str);
63 if(str.trim().equals("success")){
64 //用户登录成功
65 System.out.println("登录成功!");
66 Intent intent = new Intent(GossipActivity.this,GossiplistActivity.class);
67 startActivity(intent);
68 }
69 else{
70 //用户登录失败
71 System.out.println("登录失败!");
72 }
73 }else{
74 System.out.println("连接失败!");
75 }
76 } catch (ClientProtocolException e) {
77 // TODO Auto-generated catch block
78 e.printStackTrace();
79 } catch (IOException e) {
80 // TODO Auto-generated catch block
81 e.printStackTrace();
82 }
83
84 }};
85 } </span>
在数据库中添加一行:用户名为123,密码为456。登录后调转到另一Activity并在控制台中打印调试信息,结果如下:

3 在向本机发送HTTP请求时,有一点必须注意,就是在android 虚拟机中,127.0.0.1为android 虚拟机的IP地址,
如果要访问本机,IP地址应该改为10.0.2.2。否则肯定会导致访问不成功!
作者:余蒙
Android中利用httpclient进行网络通信的方法(以用户登录为例说明)的更多相关文章
- Android中利用Handler实现消息的分发机制(三)
在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...
- Android中利用ant进行多渠道循环批量打包
公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...
- 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...
- Android中解析XML格式数据的方法
XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...
- Android 中对于图片的内存优化方法
Android 中对于图片的内存优化方法,需要的朋友可以参考一下 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...
- Android中关于JNI 的学习(零)简单的样例,简单地入门
Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...
- Android中利用C++处理Bitmap对象
相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码 ...
- 网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求
一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是 ...
随机推荐
- 一維條碼 EAN13 的編碼方式
何謂 EAN-13碼 ? ▲ 國家代號(3位數) 中華民國的國家代號為471. ▲ 廠商代號(6位數) 由本會核發給廠商6位數的廠商代號. ▲ 商品代號(3位數) 由廠商自行編定,按一物一號的原則,不 ...
- Codeforces Gym10008E Harmonious Matrices(高斯消元)
[题目链接] http://codeforces.com/gym/100008/ [题目大意] 给出 一个n*m的矩阵,要求用0和1填满,使得每个位置和周围四格相加为偶数,要求1的数目尽量多. [题解 ...
- [转]maven入门
http://wentao365.iteye.com/blog/903396 Maven是一个采用纯Java编写的开 源项目管理工具.Maven采用了一种被称之为project object mode ...
- GDB调试之core文件(如何定位到Segment fault)
core dump又叫核心转储,当程序运行过程中发生异常,程序异常退出时,由操作系统把程序当前的内存状况存储在一个core文件中,叫core dump.(内部实现是:linux系统中内存越界会收到SI ...
- 浅谈Struts2(四)
一.Struts2的拦截器(Intercept) 作用:把多个Action中的共有代码,提取至拦截器,从而减少Action中的冗余代码. 1.Action拦截器 a.编写interceptor类 pu ...
- C++ typedef
C++ typedef 作用:用来定义类型的同义词,用作类型的说明符. 用法:typedef typeName myTypeName; 使用目的:1. 为了隐藏特定类型的实现,强调使用类型的目的.2. ...
- Mysql数据库中 ,涉及事物,循环添加数据
),), ) BEGIN declare cnt ; declare i ; declare growthid ; DECLARE t_error INTEGER DEFAULT ; DECLA ...
- git切换远程
已经开发一段时日,公司突然提出要换git仓库 查看目前所有的分支 $git branch -va 添加新的远程仓库 $ git remot add [name] [url] 查看下目前配置 $ git ...
- IE 弹出框处理经验
//各屏幕弹出窗样式 // 1366*768var style_1366x768 = "dialogWidth:950px;dialogHeight:650px;help:no;center ...
- GPL协议
GPL-General Public License 它是自由软件许可(Free Software Licence),保证最终使用者能够自由的引用,学习,拷贝,甚至修改软件.在理解这之前需要了解什么是 ...