Android客户端与服务端交互

本文和大家一起了解了一下android客户端与服务端是怎样交互的,具体内容如下

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 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">

  <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.登陆界面处理,注意

按钮监听事件中,使用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;

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • 详解android与服务端交互的两种方式

    做Android开发的程序员必须知道android客户端应该如何与服务端进行交互,这里主要介绍的是使用json数据进行交互.服务端从数据库查出数据并以json字符串的格式或者map集合的格式返回到客户端,客户端进行解析并输出到手机屏幕上. 此处介绍两种方式:使用Google原生的Gson解析json数据,使用JSONObject解析json数据 一.使用Google原生的Gson解析json数据: 记得在客户端添加gson.jar. 核心代码: 服务端: package com.mfc.ctrl

  • Android客户端与服务端交互

    本文和大家一起了解了一下android客户端与服务端是怎样交互的,具体内容如下 1.后台使用简单的servlet,支持GET或POST.这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功. servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径 我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便andr

  • java Nio使用NioSocket客户端与服务端交互实现方式

    NioSocket 客户端与服务端交互实现 java Nio是jdk1.4新增的io方式-–nio(new IO),这种方式在目前来说算不算new,更合适的解释应该是non-block IO. non-block是相对于传统的io方式来讲的.传统的Io方式是阻塞的,我们拿网络io来举例,传统的io模型如下: 服务端主线程负责不断地server.accept(),如果没有客户端请求主线程就会阻塞,当客户端请求时,主线程会通过线程池创建一个新的线程执行. 简单解释就是一个线程负责一个客户端的sock

  • java 中模拟TCP传输的客户端和服务端实例详解

    一.创建TCP传输的客户端 1.建立TCP客户端的Socket服务,使用的是Socket对象,建议该对象一创建就明确目的地,即要连接的主机: 2.如果连接建立成功,说明数据传输通道已建立,该通道就是Socket流,是底层建立好的,既然是流,说着这里既有输入流,又有输出流,想要输入流或者输出流对象,可以通过Socket来获取,可以通过getOutputStream()和getInputStream()来获取: 3.使用输出流,将数据写出: 4.关闭Socket服务. import java.io.

  • python 如何用urllib与服务端交互(发送和接收数据)

    urllib是Python3中内置的HTTP请求库,不需要单独安装,官方文档链接如下:https://docs.python.org/3/library/urllib.html从官方文档可以看出,urllib包含4个模块,如图所示. 这4个模块的功能描述如下: request:最基本的HTTP请求模块,可以用来发送HTTP请求,并接收服务端的响应数据.这个过程就像在浏览器地址栏输入URL,然后按Enter键一样. error:异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后根据实际情况

  • 基于node的tcp客户端和服务端的简单通信

    目录 1.简单介绍下TCP/IP 2.服务端编程 监听客户端连接 接收数据和发送数据 3.客户端编程 4.一个小的登录系统 1.简单介绍下TCP/IP TCP/IP是互联网相关协议的集合,分为以下四层:应用层.传输层.网络层.数据链路层. 分成四层的好处是,假如只有一层,某个地方需要改变设计时,就必须把所有整体替换掉,而分层之后只需把变动的层替换掉即可. 2. 服务端编程 node提供了net模块来实现tcp编程.主要分为服务端编程和客户端编程两部分,先来写服务端的: 监听客户端连接 先引入ne

  • Python警察与小偷的实现之一客户端与服务端通信实例

    本文实例讲述了Python警察与小偷的实现之一客户端与服务端通信,分享给大家供大家参考.具体方法分析如下: 该实例来源于ISCC 2012 破解关第四题 目的是通过逆向police,实现一个thief,能够与police进行通信 实际上就是一个RSA加密通信的例子,我们通过自己编写客户端和服务端来实现上面的thief和police的功能. 要通信,这们这次先通过python写出可以进行网络连接的客户端与服务端. 服务端代码如下: #!/usr/bin/env python import Sock

  • python Socket之客户端和服务端握手详解

    简单的学习下利用socket来建立客户端和服务端之间的连接并且发送数据 1. 客户端socketClient.py代码 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('127.0.0.1', 9999)) # 接收欢迎消息: print(s.recv(1024).decode('utf-8')) for data in [b'Michael', b'Tracy', b'

  • 用PHP的socket实现客户端到服务端的通信实例详解

    一.server.php服务端: <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'localhost'; //设置用111端口进行通信 $port = 111; //创建SOCKET if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket创建失败原因 &q

  • PHP基于socket实现的简单客户端和服务端通讯功能示例

    本文实例讲述了PHP基于socket实现的简单客户端和服务端通讯功能.分享给大家供大家参考,具体如下: 服务器端: <?php set_time_limit(0); $host="localhost"; $port=1001; //创建一个连接 $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)or die("cannot create socket\n"); //绑定socket到端口 $result=soc

随机推荐