最近在实现向服务器发送数据,遇到一个小问题,Android中发送不同的数据内容的实现方式也不相同。下面解决了传递三种不同信息的三种方式。
1.传输键-值对(key-value)
2.传输自定义对象(Object)
3.传输自定义对象集合(List< Object >)

一、网络传输键值对(key-value)
Android中传递键值对我使用的方式是利用NameValuePair进行传输。这个应该比较基础,是比较传统的Android中网络传输的方式。
要点:将你要传输的键值对利用NameValuePair封装成List集合进行传输。
Android端:

    /**     * 初始化发送的信息     * @return     */    private List initMessage() {        List message = new ArrayList();        message.add(new BasicNameValuePair("name","张三"));        message.add(new BasicNameValuePair("passwd", "112233"));        return  message;    }    /**     * 网络传递键值对     * @param content     * @param url     * @return     */    private static String HttpSentList(List content,String url){        String result = null;        HttpPost httpRequest = new HttpPost(url);        try {            HttpEntity httpEntity = new UrlEncodedFormEntity(content,"utf-8");            httpRequest.setEntity(httpEntity);            HttpClient httpClient = new DefaultHttpClient();            HttpResponse httpResponse = httpClient.execute(httpRequest);            int i = httpResponse.getStatusLine().getStatusCode();            if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){                result = EntityUtils.toString(httpResponse.getEntity());                return result;            }else{                //tv.setText("request error");            }        } catch (UnsupportedEncodingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClientProtocolException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return result;    }

服务器端直接通过request对象拿对应key值的value对象即可。
服务器端:

public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //常规传参---键值对        request.setCharacterEncoding("UTF-8");         String name = request.getParameter("name");         String passwd = request.getParameter("passwd");            response.setContentType("text/html");            PrintWriter out = response.getWriter();            out                    .println("");            out.println("");            out.println("  A Servlet");            out.println("  ");            out.print("    This is ");            out.print("姓名:"+name+"密码"+passwd);            out.println(", using the GET method");            out.println("  ");            out.println("");            out.flush();            out.close();        System.out.print("姓名:"+name+"密码"+passwd);}

2.传输自定义对象(Object)
当网络中需要向服务器传输的是一个自定义对象,这时就不能用NameValuePair实现,需要用到java中学到的一个知识,使用序列化对象使用输入输出流进行传输序列化对象。
要点:
1.将自定义对象序列化
2.Android端和客户端需要都有这个序列化对象,且类名和包名要相同
Android端:

    /*    初始化类对象信息     */    private Object initObjectMessage(){        Book book = new Book();        book.setName("疯狂Android讲义");        book.setAuthor("李刚");        return book;    }    /**     * 网络传输对象流     * @param obj     * @param urlpos     * @return     */    private static String HttpSentObject(Object obj,String urlpos){        String line = "";        URL url = null;        ObjectOutputStream oos = null;        try {            url = new URL(urlpos);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setDoInput(true);            connection.setDoOutput(true);            connection.setConnectTimeout(10000);            connection.setReadTimeout(10000);            connection.setRequestMethod("POST");            oos = new ObjectOutputStream(connection.getOutputStream());            oos.writeObject(obj);            InputStreamReader read = new InputStreamReader(connection.getInputStream());            BufferedReader br = new BufferedReader(read);            while ((line = br.readLine()) != null) {                Log.d("TAG", "line is " + line);            }            br.close();            connection.disconnect();        } catch (Exception e) {            e.printStackTrace();        } finally {        }        return line;    }

服务器端:
要点:
1.要有和Android端类名和包名相同的自定义对象。
2.利用输入输出流进行读写。

//对象流-----序列化对象public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        ObjectInputStream ois = null;           try {                 ois = new ObjectInputStream(request.getInputStream());                 Book book = (Book) ois.readObject();                 System.out.println("书名是: " + book.getName());                 System.out.println("作者是: " + book.getAuthor());                 PrintWriter out = response.getWriter();                 out.print("success");                 out.flush();                 out.close();            } catch (Exception e) {                 e.printStackTrace();            } finally {                 ois.close();            }            }

3.传输自定义对象集合。(List< Object >)
当要传输自定义对象的集合时,利用的网络传输方式和二相同,因为
oos.writeObject(obj);这个obj可以为List对象。但需要注意的一点是这其中我们使用的是ArrayList而不知List,至于List和ArrayList的区别自己到网上搜。
Android端:

    private ArrayList initListObjMessage(){        ArrayList list = new ArrayList();        Book book1 = new Book();        book1.setName("疯狂Android讲义");        book1.setAuthor("李刚");        Book book2= new Book();        book2.setName("深入理解Android");        book2.setAuthor("某某");        list.add(book1);        list.add(book2);        return  list;    } private static String HttpSentListObj(ArrayList obj, String urlpos){        String line = "";        URL url = null;        ObjectOutputStream oos = null;        try {            url = new URL(urlpos);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setDoInput(true);            connection.setDoOutput(true);            connection.setConnectTimeout(10000);            connection.setReadTimeout(10000);            connection.setRequestMethod("POST");            oos = new ObjectOutputStream(connection.getOutputStream());            oos.writeObject(obj);            InputStreamReader read = new InputStreamReader(connection.getInputStream());            BufferedReader br = new BufferedReader(read);            while ((line = br.readLine()) != null) {                Log.d("TAG", "line is " + line);            }            br.close();            connection.disconnect();        } catch (Exception e) {            e.printStackTrace();        } finally {        }        return line;    }  

服务器端:
和二基本相同

public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {//对象集合        ObjectInputStream ois = null;           try {                 ois = new ObjectInputStream(request.getInputStream());                 List list = (List) ois.readObject();                 System.out.println("书名是: " + list.get(0).getName());                 System.out.println("作者是: " + list.get(0).getAuthor());                 System.out.println("书名是: " + list.get(1).getName());                 System.out.println("作者是: " + list.get(1).getAuthor());                 PrintWriter out = response.getWriter();                 out.print("success");                 out.flush();                 out.close();            } catch (Exception e) {                 e.printStackTrace();            } finally {                 ois.close();            }    }

基本就这些了,算是一种总结吧。

更多相关文章

  1. Android(安卓)UI框架概览
  2. Android(安卓)用户界面(User Interface)概要
  3. Android--数据持久化之内部存储、Sdcard存储
  4. Android用户界面布局(layouts)
  5. 赵雅智_HttpClient的 get请求和post请求
  6. Android(安卓)AutoLayout全新的适配方式
  7. Android(安卓)任务栈
  8. Android(安卓)OkHttp的Cookie自动化管理
  9. Android的SQLite使用实例

随机推荐

  1. Android(安卓)使用AgentWeb库轻量级H5混
  2. AsyncTask不同版本线程池的区别
  3. Android(安卓)Native性能测试方法
  4. INSTALL FAILED CONFLICTING PROVIDER
  5. Android(安卓)开发中屏蔽物理键盘
  6. Android(安卓)Studio 编译下载Gradle卡住
  7. flutter中实现仿Android端的onResume和on
  8. Android(安卓)Studio Checkout GitHub Er
  9. Android(安卓)DataBing详解
  10. android广播的应用