Android客户端和Servlet服务器端通过JSON交互

本文结构如下:

1. android和servlet之间的直接信息传递(不通过json)

1.1 android端代码

1.2 servlet端代码

2. android和servlet之间通过json进行交互

2.1 android端代码

2.2 servlet端代码

=============================================================

1. android和servlet之间的直接信息传递

在android端通过httpclient去访问服务器,发送request请求,并获取response。

在servlet端只需要简单的定义doGet方法和doPost方法即可。

1.1 android端代码

package com.example.helloworld;

public class MainActivity extends ActionBarActivity {

    private String responseMsg = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Thread loginThread = new Thread(new LoginThread());
                loginThread.start();
            }
        });

    }
      //发送请求的主要方法
    private boolean loginServer(){
        boolean loginValidate = false;
             //servlet服务器地址是
        String urlStr = "http://192.168.1.24:8080/servletTest/test";
        HttpPost request = new HttpPost(urlStr);

        try {
            HttpClient client = getHttpClient();
            //执行请求
            HttpResponse response = client.execute(request);        //response是servlet给出的返回结果
            if(response.getStatusLine().getStatusCode() == 200){
                loginValidate = true;
                responseMsg = EntityUtils.toString(response.getEntity());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return loginValidate;
    }

    public HttpClient getHttpClient(){
        BasicHttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, 5*1000);
        HttpConnectionParams.setSoTimeout(httpParams, 10*1000);
        HttpClient client = new DefaultHttpClient(httpParams);
        return client;
    }

    class LoginThread implements Runnable{
        public void run(){
      boolean loginValidate = loginServer();
      System.out.println("======================bool is :"+loginValidate+"----------------response: "+responseMsg);
        }
    }
}

1.2 servlet端代码

package cn.dragon.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

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

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import com.sun.corba.se.pept.transport.Connection;

public class ServletDemoFirst extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//        response.setContentType("text/html; charset=GB2312");
//        PrintWriter outPrintWriter = response.getWriter();
//        outPrintWriter.println("hello");
//        outPrintWriter.close();
        //Connection conn = null;     //首先建立数据库连接
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "admin";
        PrintWriter out = response.getWriter();
        //out.println("welcom");
        try {
            Class.forName(driver);
            java.sql.Connection conn = DriverManager.getConnection(url, user, password);
            //out.println("loading success");

            Statement statement = conn.createStatement();       //进行数据库查询。
            ResultSet rs = statement.executeQuery("select * from career");
            ArrayList<String> list1 = new ArrayList<String>();
            while(rs.next()){
                //out.println(rs.getString(1));
                list1.add(rs.getString(1));
            }       //out用来向客户端返回数据。如果用网页访问这个网址,查询数据库的结果就显示在网页上,如果用android访问,就返回给android手机
            out.println(list1.toString());
            rs.close();
            statement.close();
            conn.close();
        } catch (ClassNotFoundException cnfex) {
            //System.err.println("装载 JDBC/ODBC 驱动程序失败。");
            out.println("loading JDBC failed");
            cnfex.printStackTrace();
            System.exit(1); // terminate program
        } catch (SQLException sqlex) {
            //System.err.println("无法连接数据库");
            out.println("can not connect to the database");
            sqlex.printStackTrace();
            System.exit(1); // terminate program
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{     doGet(request, response);
    }

}

以上就是两部分的代码。都比较好理解,而且也给了一些注释。

==================================================================

2. 通过JSON进行客户端服务器的通讯

2.1 android端

package com.example.helloworld;

public class MainActivity extends ActionBarActivity {

    private String responseMsg = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                //Intent intent = new Intent(MainActivity.this, InfoActivity.class);
                //startActivity(intent);
                Thread loginThread = new Thread(new LoginThread());
                loginThread.start();
            }
        });

    }

    public HttpClient getHttpClient(){
        BasicHttpParams httpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParams, 5*1000);
        HttpConnectionParams.setSoTimeout(httpParams, 10*1000);
        HttpClient client = new DefaultHttpClient(httpParams);
        return client;
    }

    private void sendJson(){
        //boolean loginValidate = false;
        String urlStr = "http://192.168.1.24:8080/servletTest/test";
        HttpPost post = new HttpPost(urlStr);
        try{
            //向服务器写json
            JSONObject json1 = new JSONObject();
            //Object email = null;
            Object email = "hlelo";
            json1.put("email", email);
            //Object pwd = null;
            Object pwd = "wodls";
            json1.put("password", pwd);

            System.out.println("=============="+json.toString());
            //保证json数据不是乱码
            StringEntity se = new StringEntity(json.toString());
            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            post.setEntity(se);

            //发送json给服务器
            HttpClient httpClient = getHttpClient();
            HttpResponse httpResponse = httpClient.execute(post);

            /*int httpCode = httpResponse.getStatusLine().getStatusCode();
            if(httpCode == HttpURLConnection.HTTP_OK && httpResponse != null){
                //org.apache.http.Header[] headers = httpResponse.getAllHeaders();
                HttpEntity entity = httpResponse.getEntity();
                //org.apache.http.Header header = httpResponse.getFirstHeader("content-type");
                //读取服务器返回的json
                InputStream inputStream = entity.getContent();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                BufferedReader reader = new BufferedReader(inputStreamReader);
                String s;
                while((s= reader.readLine())!= null){
                    result.append(s);
                }
                reader.close();

                JSONObject jsonObject = new JSONObject(result.toString());
                String nameString = jsonObject.getString("email");
                String passString = jsonObject.getString("password");
                System.out.println("===============email is: "+nameString+", password is: "+passString);*/
        }catch(Exception exception){
            exception.printStackTrace();
        }
    }

    class LoginThread implements Runnable{
        public void run(){
            sendJson();
        }
    }
 }

2.2 servlet端代码

package cn.dragon.servlet;

public class ServletDemoFirst extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //处理json内容
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/json");
        String acceptjson = "";
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream(), "utf-8"));
            StringBuffer sb = new StringBuffer("");
            String temp;
            while((temp = br.readLine()) != null){
                sb.append(temp);
            }
            br.close();                             //以上的过程都从request中读取json,并将json转换成string,这样可以显示出来。最终String类型的json就是acceptjson  
            acceptjson = sb.toString();
            System.out.println("=======json is==========="+acceptjson);
            if(acceptjson != ""){
                //System.out.println("get the json successfully");
                JSONObject jo = JSONObject.fromObject(acceptjson);          //email即是android端发送过来的json当中的一个key,我们使用get方法读取对应的value
                System.out.println(jo.get("email"));
            }
            else{
                System.out.println("get the json failed");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

}

其实应该还有一段内容是servlet将json返还给android端,然后android端再解析出来。关于android端的解析过程在注释掉的部分中,但这段内容我还没有验证。

下面稍微补充一点关于JSONArray的内容——JSONArray如何传输与解析

/**** android: sendJson()      *****/
private void sendJson(){
        //boolean loginValidate = false;
        StringBuilder result = new StringBuilder();
        String urlStr = "http://192.168.1.24:8080/servletTest/test";
        HttpPost post = new HttpPost(urlStr);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        //params.add(new BasicNameValuePair("name", "this is post"));
        try{
            //向服务器写json
            JSONObject json1 = new JSONObject();
            //Object email = null;
            Object email = "hlelo";
            json1.put("email", email);
            //Object pwd = null;
            Object pwd = "wodls";
            json1.put("password", pwd);

            JSONArray jsonArray = new JSONArray();        //生成一个JSONARRAY并将上面的json装入其中
            jsonArray.put(0, json1);
            JSONObject json = new JSONObject();        //再生成一个JSONObject,将刚才的JSONArray放入其中,再发送到服务器端 
            json.put("dao", jsonArray);
            System.out.println("=============="+json.toString());

            //保证json数据不是乱码
            StringEntity se = new StringEntity(json.toString());
            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
            post.setEntity(se);

            //发送json给服务器
            HttpClient httpClient = getHttpClient();
            HttpResponse httpResponse = httpClient.execute(post);

        }catch(Exception exception){
            exception.printStackTrace();
        }    
/***** servlet: doPost()  *****/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{//处理json内容
        System.out.println("=======json is===========");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/json");
        String acceptjson = "";
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream(), "utf-8"));
            StringBuffer sb = new StringBuffer("");
            String temp;
            while((temp = br.readLine()) != null){
                sb.append(temp);
            }
            br.close();
            acceptjson = sb.toString();
            System.out.println("=======json is==========="+acceptjson);
            if(acceptjson != ""){
                //System.out.println("get the json successfully");          //先获取json
                JSONObject jo = JSONObject.fromObject(acceptjson);
                //再获取json中包含的jsonarry,dao是刚才android端给出的key
                JSONArray ja = jo.getJSONArray("dao");          //循环获取jsonarray中的每个json
                for(int i = 0; i < ja.size(); i++){
                    JSONObject object = JSONObject.fromObject(ja.get(i));             //获取json中的email值,email是json中的key
                    System.out.println("email is: "+object.get("email"));
                }
            }
            else{
                System.out.println("get the json failed");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

Bon Appetite~

时间: 2024-10-14 12:00:55

Android客户端和Servlet服务器端通过JSON交互的相关文章

Android网络(3):HttpClient作客户端,Tomcat Servlet作服务器的交互示例

前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的.我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse.] 1.下载Eclipse的Tomcat插件:http://www

android 客户端支付宝 php服务器端编写

生成私钥 输入"genrsa -out rsa_private_key.pem 1024"命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原始的商户私钥(请妥善保 存该文件,PHP 开发语言中需要使用该文件), 生成公钥 输入"rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem"命令回车 后,在当前 bin 文件目录中会新增一个 rsa_p

#游戏平台接入#Android游戏平台接入(一)#android客户端和C++底层的数据交互#jni编程#欢迎交流#

1.jni是什么 2.jni应用情景 3.java 调用C++过程解析(附例子) 4.C++调用java 过程解析(附例子) 5.java,c++,jni数据类型对照 6.常用jni函数解析 http://blog.csdn.net/skywalker256/article/details/4677644

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

今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台使用简单的servlet,支持GET或POST.这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功. servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径 我是在myEclipse上创建的一个we

Android客户端与PHP服务端通信(二)

概述 本节通过一个简单的demo程序简单的介绍Android客户端通过JSON向PHP服务端提交订单,PHP服务端处理订单后,通过JSON返回结果给Android客户端.正常来讲,PHP服务端在处理订单过程中,需要与MySQL数据库交互,这里为了简单起见,暂时省掉MySQL. 通信格式 首先,需要定下客户端与服务端之间通信格式,如下表 Android客户端 客户端与服务端采用JSON数据格式通信,同时采用HTTP通信协议交互,采用POST方式提交结果.同时还要注意一点,与WEB服务器通信的过程需

简单的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 客户端与服务器端进行数据交互(二、登录客户端)

概要 Android客户端分为User,HttpUtil,HttpCallbackListener,MainActivity四个部分.User model与服务端的一样,一方面是用于本地用户信息的存储model,另一方面也是为了保证构造URL时使用的key一致. HttpUtil封装了发送Http请求的过程和构造URL的函数,HttpCallbackListener是用于发送请求后的回调接口,MainActivity就是用于测试的Activity交互界面了. User model 不再贴出,见上

Android 客户端与服务器端进行数据交互(一、登录服务器端)

概要 安卓APP要实现很多功能(比如登录注册.发表评论等)时都必须要使用到网络数据交互.所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手. 预期效果图如下,输入手机号和密码,点击Login按钮,上传数据到服务器端进行验证,再对结果进行反馈. 博客分一二两篇,第一篇是服务器端,第二篇是Android客户端 而服务器端分为User model.UserDAO.LoginServlet三个部分,只写了用户登录验证流程中最简单的实现逻辑,仅供参考. Us

Android客户端和服务器端数据交互的第二种方法

网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第二种: 一.服务器端: 代码1:添加名为"AndroidServerServlet.java"的文件 package com.ghj.packageofservlet; import java.io.IOException; import java.io.PrintWriter; import javax.serv