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

时间:2021-10-19 17:16:23
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,分别作为登录界面和登录成功界面。


 1 <relativelayout
android:layout_height="match_parent"
android:layout_width="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"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
2
3 <textview android:id="@+id/textView1"
android:layout_alignparenttop="true"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_margintop="40dp"
android:layout_width="wrap_content"android:text="HelloWorld登陆示例"> <edittext
  android:ems="10"
android:hint="请输入账号"
android:id="@+id/et_user"
android:layout_below="@+id/textView1"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_margintop="33dp"
android:layout_width="wrap_content"> <requestfocus>
</requestfocus>
</edittext> <edittext
android:ems="10"
android:hint="请输入密码"
android:id="@+id/et_psw"
android:inputtype="textPassword"
android:layout_below="@+id/et_user"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_margintop="40dp"
android:layout_width="wrap_content"> <button
  android:id="@+id/btn_login"
android:layout_below="@+id/et_psw"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_margintop="37dp"
android:layout_width="wrap_content"
android:text="登陆">
</button>
</edittext>
</textview>
</relativelayout>


 <relativelayout android:layout_height="match_parent" android:layout_width="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" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

     <textview android:layout_alignparenttop="true" android:layout_centerhorizontal="true" android:layout_height="wrap_content" android:layout_margintop="46dp" android:layout_width="wrap_content" android:text="登陆成功">

 </textview></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;
}
}
</namevaluepair></namevaluepair></string,>

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;
} }
}
</string,></string,>
 

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

 <!--?xml version=1.0 encoding=utf-8?-->
<manifest android:versioncode="1" android:versionname="1.0" package="com.example.logindemo" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minsdkversion="8" android:targetsdkversion="18"> <uses-permission android:name="android.permission.INTERNET"> <intent-filter> <category android:name="android.intent.category.LAUNCHER">
</category></action></intent-filter>
</activity> </activity> <service android:name="com.example.logindemo.ConnectService">
</service>
</application> </uses-permission></uses-sdk></manifest>
 

6.登陆界面处理,注意

    1. 按钮监听事件中,使用Intent将要传递的值传给service。接收广播类中,同样使用Intent将要传递的值传给下一个Activity。在onCreate()中,动态注册接收广播类的实例receiver。在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个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;
      } }
       

      运行截图:

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

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

  1. java客户端与服务端交互通用处理 框架解析

    一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...

  2. c&plus;&plus; 网络编程(一)TCP&sol;UDP windows&sol;linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  3. Fresco 源码分析&lpar;二&rpar; Fresco客户端与服务端交互&lpar;3&rpar; 前后台打通

    4.2.1.2.4 PipelineDraweeControllerBuilder.obtainController()源码分析 续 上节中我们提到两个核心的步骤 obtainDataSourceSu ...

  4. Fresco 源码分析&lpar;二&rpar; Fresco客户端与服务端交互&lpar;1&rpar; 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  5. socket 通信 入门3 android 客户端 C&num; 服务端

    这是一个android端操控服务器的例子  就是发送简单指令到服务器  然后服务器响应什么的... 当然这里是未完成的  只是简单展示一下大致思路 首先连接建立起来后  服务端给客户端一条信息  告诉 ...

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

    服务端: package com.sxt.day05; import java.io.IOException; import java.util.ArrayList; import javax.ser ...

  7. Androidclient与服务端交互之登陆演示样例

    今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...

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

    http://www.software8.co/wzjs/yidongkaifa/6407.html 对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不 ...

  9. UDP网络程序,客户端和服务端交互原理

    创建一个udp客户端程序的流程是简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实 ...

随机推荐

  1. 【iCore3应用开发平台】发布 iCore3 应用开发平台出厂代码rev0&period;0&period;5

    iCore3开发平台固件版本信息 =============================================================[stm32f407]:iCore3 ARM ...

  2. Deep learning:四十六&lpar;DropConnect简单理解&rpar;

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  3. 简单的python服务器程序

    一个接受telnet输入的服务器端小程序 #!/usr/local/bin/python3.5 #coding:utf-8 import socket host = '' port = 51423 s ...

  4. I2C总线之&lpar;三&rpar;---以C语言理解IIC

    为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形: 如下图所示的写操作的时序图: 读时序的理解同理.对于时序不理解的朋友请参考“I2C总线之(二)---时序” 完整的程序如下: ...

  5. ORACLE WIN7安装过程截图

    尽管 有点不正规,但还可以.

  6. SVN项目库错误Unsupported FS format svn&colon; Expected FS format between &&num;39&semi;1&&num;39&semi; and &&num;39&semi;4&&num;39&semi;&semi; found format &&num;39&semi;6&&num;39&semi;

    SVN项目库错误Unsupported FS format svn: Expected FS format between '1' and '4'; found format '6' 从这里找到解决方 ...

  7. Error getting nested result map values for &&num;39&semi;company&&num;39&semi;&period; Cause&colon; java&period;sql&period;SQLException&colon; Invalid value for getInt&lpar;&rpar; - &&num;39&semi;NFHK188&&num;39&semi;

    我今天遇到一个我不解的问题,是mybatis多对一关系查询出问题了,但是我自己还是解决了,在网上也查过那个错误,可是找不到我想要的.不知道你们遇到过没有,我接下来分享给大家.希望我这个第一篇博客能帮助 ...

  8. &lbrack;NOIP&rsqb;2016天天爱跑步

    [NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  9. HTTP协议11-cookie和seesion

    因为HTTP协议是无状态的,但是很多网站的功能需要先登录才能使用.这就引入了cookie. Cookie机制 服务器用HTTP头向客户端发送cookies.客户端(浏览器)解析cookies并将它们保 ...

  10. selenium&plus;python-autoit文件上传

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...