Android中网络传输不同内容
16lz
2021-01-24
最近在实现向服务器发送数据,遇到一个小问题,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
服务器端:
和二基本相同
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(); } }
基本就这些了,算是一种总结吧。
更多相关文章
- Android(安卓)UI框架概览
- Android(安卓)用户界面(User Interface)概要
- Android--数据持久化之内部存储、Sdcard存储
- Android用户界面布局(layouts)
- 赵雅智_HttpClient的 get请求和post请求
- Android(安卓)AutoLayout全新的适配方式
- Android(安卓)任务栈
- Android(安卓)OkHttp的Cookie自动化管理
- Android的SQLite使用实例