Android客户端与服务端交互之登陆示例

今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的

1.后台使用简单的servlet,支持GET或POST。这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功。

servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径

我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便android客户端访问

<servlet>
		<servlet-name>helloWorld</servlet-name>
		<servlet-class>com.zhongzhong.wap.action.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>helloWorld</servlet-name>
		<url-pattern>/queryOrder</url-pattern>
	</servlet-mapping>
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.zhongzhong.wap.bean.UserBean;

public class HelloServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		 resp.setContentType("text/html");
	        PrintWriter out = resp.getWriter();
	        Boolean flag = false;
	        String userName = req.getParameter("un");
	        String password = req.getParameter("pw");
	        if(userName.equals("htp")&&password.equals("123"))
	        {
	        	flag = true;
	        }

	        else flag = false;
	        System.out.println("userName:"+userName+" password:"+password);
	        out.print(flag);
	        out.flush();
	        out.close();
	}

}

2.然后我是在安卓的ADT上创建一个安卓项目,建立两个Activity,分别作为登录界面和登录成功界面。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:text="HelloWorld登陆示例" />

    <EditText
        android:id="@+id/et_user"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="33dp"
        android:ems="10"
        android:hint="请输入账号" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/et_psw"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_user"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp"
        android:ems="10"
        android:hint="请输入密码"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_psw"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="37dp"
        android:text="登陆" />

</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".NaviActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="46dp"
        android:text="登陆成功" />

</RelativeLayout>

3.HTTP的访问公共类,用于处理GET和POST请求

package com.example.logindemo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import android.content.Entity;
import android.util.Log;

public class HttpUtil {
	// 创建HttpClient对象
	public static HttpClient httpClient = new DefaultHttpClient();
	public static final String BASE_URL = "http://192.168.3.14:8090/HelloWord/";

	/**
	 *
	 * @param url
	 *            发送请求的URL
	 * @return 服务器响应字符串
	 * @throws Exception
	 */
	public static String getRequest(String url) throws Exception {
		// 创建HttpGet对象。
		HttpGet get = new HttpGet(url);
		// 发送GET请求
		HttpResponse httpResponse = httpClient.execute(get);
		// 如果服务器成功地返回响应
		if (httpResponse.getStatusLine().getStatusCode() == 200) {
			// 获取服务器响应字符串
			String result = EntityUtils.toString(httpResponse.getEntity());
			return result;
		} else {
			Log.d("服务器响应代码", (new Integer(httpResponse.getStatusLine()
					.getStatusCode())).toString());
			return null;
		}
	}

	/**
	 *
	 * @param url
	 *            发送请求的URL
	 * @param params
	 *            请求参数
	 * @return 服务器响应字符串
	 * @throws Exception
	 */
	public static String postRequest(String url, Map<String, String> rawParams)
			throws Exception {
		// 创建HttpPost对象。
		HttpPost post = new HttpPost(url);
		// 如果传递参数个数比较多的话可以对传递的参数进行封装
		List<NameValuePair> params = new ArrayList<NameValuePair>();
		for (String key : rawParams.keySet()) {
			// 封装请求参数
			params.add(new BasicNameValuePair(key, rawParams.get(key)));
		}
		// 设置请求参数
		post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
		// 发送POST请求
		HttpResponse httpResponse = httpClient.execute(post);
		// 如果服务器成功地返回响应
		if (httpResponse.getStatusLine().getStatusCode() == 200) {
			// 获取服务器响应字符串
			String result = EntityUtils.toString(httpResponse.getEntity());
			return result;
		}
		return null;
	}
}

4.IntentService服务,用于在后台以队列方式处理耗时操作。

package com.example.logindemo;

import java.util.HashMap;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class ConnectService extends IntentService {
	private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";

	public ConnectService() {
		super("TestIntentService");
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		// TODO Auto-generated method stub
		/**
         * 经测试,IntentService里面是可以进行耗时的操作的
         * IntentService使用队列的方式将请求的Intent加入队列,
         * 然后开启一个worker thread(线程)来处理队列中的Intent
         * 对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
         */
        Boolean flag = false;
        //通过intent获取主线程传来的用户名和密码字符串
        String username = intent.getStringExtra("username");
        String password = intent.getStringExtra("password");
        flag = doLogin(username, password);
        Log.d("登录结果", flag.toString());  

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction(ACTION_RECV_MSG);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        broadcastIntent.putExtra("result", flag.toString());
        sendBroadcast(broadcastIntent);  

	}

	 // 定义发送请求的方法
    private Boolean doLogin(String username, String password)
    {
        String strFlag = "";
        // 使用Map封装请求参数
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("un", username);
        map.put("pw", password);
        // 定义发送请求的URL
      String url = HttpUtil.BASE_URL + "queryOrder?un=" + username + "&pw=" + password;  //GET方式
       // String url = HttpUtil.BASE_URL + "LoginServlet"; //POST方式
        Log.d("url", url);
        Log.d("username", username);
        Log.d("password", password);
        try {
            // 发送请求
            strFlag = HttpUtil.postRequest(url, map);  //POST方式
//          strFlag = HttpUtil.getRequest(url);  //GET方式
            Log.d("服务器返回值", strFlag);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  

        if(strFlag.trim().equals("true")){
            return true;
        }else{
            return false;
        }  

    }
}

5。在AndroidManifest.xml中注册IntentService。注意uses-permission节点,为程序开启访问网络的权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.logindemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.logindemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.logindemo.NaviActivity"
            android:label="@string/title_activity_navi" >
        </activity>

        <service android:name="com.example.logindemo.ConnectService" >
        </service>
    </application>

</manifest>

6.登陆界面处理,注意

  1. 按钮监听事件中,使用Intent将要传递的值传给service。
  2. 接收广播类中,同样使用Intent将要传递的值传给下一个Activity。
  3. 在onCreate()中,动态注册接收广播类的实例receiver。
  4. 在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver()? 的异常。

package com.example.logindemo;

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
	 private static final String ACTION_RECV_MSG = "com.example.logindemo.action.RECEIVE_MESSAGE";
	private Button loginBtn;
	private EditText et_username;
	private EditText et_password;
	private String userName;
	private String passWord;
	private MessageReceiver receiver ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		//动态注册receiver
        IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new MessageReceiver();
        registerReceiver(receiver, filter);
	}

	private void initView() {
		// TODO Auto-generated method stub
		et_username = (EditText)findViewById(R.id.et_user);
		et_password =( EditText)findViewById(R.id.et_psw);
		loginBtn = (Button)findViewById(R.id.btn_login);
		loginBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(matchLoginMsg())
				{
					// 如果校验成功
                    Intent msgIntent = new Intent(MainActivity.this, ConnectService.class);
                    msgIntent.putExtra("username", et_username.getText().toString().trim());
                    msgIntent.putExtra("password", et_password.getText().toString().trim());
                    startService(msgIntent);
				}

			}
		});
	}

	protected boolean matchLoginMsg() {
		// TODO Auto-generated method stub
		userName = et_username.getText().toString().trim();
		passWord = et_password.getText().toString().trim();
		if(userName.equals(""))
		{
			Toast.makeText(MainActivity.this, "账号不能为空",Toast.LENGTH_SHORT).show();
			return false;
		}
		if(passWord.equals(""))
		{
			Toast.makeText(MainActivity.this, "密码不能为空",Toast.LENGTH_SHORT).show();
			return false;
		}
		return true;
	}
	//接收广播类
    public class MessageReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
           String message = intent.getStringExtra("result");
           Log.i("MessageReceiver", message);
        // 如果登录成功
            if (message.equals("true")){
                // 启动Main Activity
                Intent nextIntent = new Intent(MainActivity.this, NaviActivity.class);
                startActivity(nextIntent);
                // 结束该Activity
                finish();
                //注销广播接收器
                context.unregisterReceiver(this);
            }else{
            	Toast.makeText(MainActivity.this, "用户名或密码错误,请重新输入!",Toast.LENGTH_SHORT).show();
            }  

        }
    }
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

运行截图:

转载自http://blog.csdn.net/softwave

时间: 2024-10-10 15:44:23

Android客户端与服务端交互之登陆示例的相关文章

android客户端与服务端交互的三种方式

android客户端向服务器通信一般有以下选择: 1.传统的java.net.HttpURLConnection类 2.apache的httpClient框架(已纳入android.jar中,可直接使用) 3.github上的开源框架async-http(基于httpClient) ---------------------------------------------------------------------------------- 下面分别记录这三种方式的使用, 传统方式: /**

Android WebView与服务端交互Demo

使用WebView可以让Android端的开发工作大量减少,原因是在服务端可以为其做一定的工作,下面这个小Demo就实现了从Android客户端与服务端的交互.我这里客户端使用的工具是Eclipse,服务端使用MyEclipse. 实现效果图: 客户端: 点击登录按钮后,页面跳转,而在服务端Console中看到如下(只看最后一行即可): 可以看到服务端收到了客户端发过来的用户名:yao. 源代码: 客户端: activity_main: <RelativeLayout xmlns:android

Android客户端与服务端(jsp)之间json的传输与解析【附效果图附源码】

最近有个项目需要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,可以实现基本功能:android客户端发送json到服务端,服务端使用jsp接收,解析后以json的形式返回给客户端,客户端接收打印,先看看运行的效果截图,源码会在文章的末尾给出. 1.服务端:接收到json后解析打印,然后发送json到客户端 2.客户端,收到服务端返回的json后打印 简单的介绍下源码: 服务端使用json.jsp来接收解析客户端传过来的json,json的解析需要使用lib目录

Android 客户端与服务端JSP相互传递中文

为了兼容简体.繁体及其他语系,推荐使用UTF-8编码. 首选,我们看看Android端应该怎么做: 在发送前,应该对参数值要进行UTF-8编码,我写了一个static的 转换函数,在做发送动作前用它将参数值转换成utf8编码: public class NetUtil { static public String toUtf8Url(String value) { try { return java.net.URLEncoder.encode(value, "utf8"); } cat

python3中实现客户端与服务端交互发送文件

在python3中实现客户端与服务端程序交互,从客户端发送文件到服务端 客户端代码:client.py #!/usr/bin/env python #_*_ encoding=utf-8 _*_ import socket,sys,os ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.connect(ip_port) container = {'key':'','data':''} while True:     input_data =

android 38 Abdroid客户端和服务端交互

服务端: package com.sxt.day05; import java.io.IOException; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest

简单的android客户端servlet服务端的交互

android客户端通过GET方式发送数据到服务端,服务端获得数据后,从服务端获取数据库里的信息,并以JSON数据格式返回. 1.GET方式传参的格式: http://127.0.0.1/AndroidService/android/upload?title=aaa&timelength=90的形式 参数是?后的title=aaa&timelength=90.多个参数用&连接. 2.连接服务器发送请求参数并获得服务器返回的数据,客户端获得数据后,主要是对JSON数据的一些解析. /

转-Android客户端和服务端如何使用Token和Session

http://www.software8.co/wzjs/yidongkaifa/6407.html 对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西.    一.我们先解释一下他的含义:    1.Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而

关于AIDL客户端与服务端交互的包名问题-package

今天在做一个有关AIDL的例子的时候,遇到一个小问题,死活两个进程就是无法通信.按着书上的例子做的(此处代码出自疯狂Android讲义第2版),还是出错,最后在网上查了下才知道是包名的问题.也就是说自己定义的那个AIDL接口所在的包的包名必须保持客户端和服务器端一致.否则会报错,程序强制退出.错误信息如下(事物绑定失败): 在调试模式下会看到如下异常(目标调用异常)抛出: 之所以这样是因为我的包名不一致,如下:                               两者所在的包不一样,这是