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。否则肯定会导致访问不成功!

作者:余蒙

时间: 2024-10-10 07:59:57

Android中利用httpclient进行网络通信的方法(以用户登录为例说明)的相关文章

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

Android中利用命令行进行截屏并导出到电脑上

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/27819525 大多数人最常用的截屏方法可能就是利用手机的快捷按键了,但是那样如果要导入到电脑中效率会比较低.实际上有更好的截屏方式,最简单的当然就是利用Eclipse中的DDMS进行截屏了,点击"Screen Capture"按钮后等待10多秒,然后就可直接利用Save按钮保存到电脑中. 显然,由于要进行图片显示的原因,在DDMS中会

Android中利用Handler实现消息的分发机制(三)

在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而如果在子线程中需要去使用Handler的时候,我们就需要显式地去调用Looper的 prepare方法和loop方法,从而为子线程创建其唯一的Looper. 具体代码如下: class LooperThread extends Thread { public Handler mHandler; public void run()

Android中使用代码截图的各种方法总结

1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行Layout,画一个按键(res/layout/main.xml): <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android

Android中利用OpenMax 编程的基本流程

最近由于公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,可是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播放器硬解码的开发能起到点作用.由于对视频也不了解,所以难免有不少错误,欢迎高手指导. 1: 由文件或者设备来创建一个dataSource(DataSource) (其中可以是文件描述符fd, uri ,http) 2:  通过dataSource来创建一个MediaExtractor(即视频的分流器

Android中利用ant进行多渠道循环批量打包

公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android中利用ant进行多渠道循环批量打包(一) Android中利用ant进行多渠道循环批量打包(二) 次要参考:?? Mac中用Ant实现Android的批量打包碰到的一些问题以及解决方法 Android Ant 批量多渠道打包实例.md [Android分享]?最新的Android Sdk 使用Ant

Android中利用SharedPreferences保存信息

package com.example.sharepreferen; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.vi

android中bitmap压缩的几种方法的解读

最近在研究微信的sdk,在缩略图这遇到了一点问题. 微信的缩略图要求是不大于32k,这就需要对我的图片进行压缩.试了几种方法,一一道来. 1.质量压缩法: 代码如下 ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; while ( baos.toByteArray().length /

【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添加进工作的build path.3.(关键的一步)将lib设为源文件夹.如果不设置,则程序编译可以通过,但运行的时候,会报: java.lang.NoClassDefFoundError # re: Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundErro