使用HttpURLConnection实现在android客户端和服务器之间传递对象

时间:2022-11-03 19:44:35

一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml字符串然后传输,那么有没有可能我们直接在android客户端上传递一个Object给服务器端呢?答案是肯定的。

我们看一个简单的App注册页面,如下图:

使用HttpURLConnection实现在android客户端和服务器之间传递对象

当我们点击注册按钮的时候,将用户的注册信息通过一个Object对象传递到服务器,好,下来我们看看怎么样来传递对象:

首先我们要把用户的注册信息封装成一个JavaBean,为了这个JavaBean可以在网络上传输,我们要实现Serializable接口:

public class Person implements Serializable {

	/**
*
*/
private static final long serialVersionUID = 1L; private String password;
private String username;
private String nickname; public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getNickname() {
return nickname;
} public void setNickname(String nickname) {
this.nickname = nickname;
} public Person(String password, String username, String nickname) {
super();
this.password = password;
this.username = username;
this.nickname = nickname;
} public Person() {
} }

当我们点击注册按钮的时候,先将用户的注册信息封装起来,然后使用一个AsyncTask来执行网络请求,该AsyncTask的参数即用户注册信息封装成的Bean:

TransObject to = new TransObject();
to.execute(new Person(passwd.getText().toString(), name.getText()
.toString(), nickname.getText().toString()));

好,我们下来看看TransObject这个类:

	class TransObject extends AsyncTask<Person, Void, String> {

		@Override
protected String doInBackground(Person... params) {
StringBuffer sb = new StringBuffer();
Person p = params[0];
BufferedReader reader = null;
HttpURLConnection con = null;
ObjectOutputStream oos = null;
try {
URL url = new URL("http://192.168.1.106/android/to");
con = (HttpURLConnection) url.openConnection();
// 设置允许输出,默认为false
con.setDoOutput(true);
con.setConnectTimeout(5 * 1000);
con.setReadTimeout(10 * 1000);
// 请求方式为POST请求
con.setRequestMethod("POST");
oos = new ObjectOutputStream(con.getOutputStream());
// 向服务端写数据
oos.writeObject(p);
// 获得服务端的返回数据
InputStreamReader read = new InputStreamReader(
con.getInputStream());
reader = new BufferedReader(read);
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (con != null) {
con.disconnect();
}
}
return sb.toString();
} @Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (result != null && "OK".equals(result)) {
Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT)
.show();
}
}
}

我们在doInBackground中执行我们的网络请求,通过一个对象输出流将我们的对象输出到服务端,然后将请求结果返回给onPostExecute方法,在onPostExecute中判断是否注册成功。这是客户端的写法,我们再看看服务端的写法:

@WebServlet("/to")
public class TransObject extends HttpServlet {
private static final long serialVersionUID = 1L; public TransObject() {
} protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
} protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
try {
Person p = (Person) ois.readObject();
System.out.println("密码是:" + p.getPassword());
System.out.println("用户名是:" + p.getUsername());
System.out.println("昵称是:" + p.getNickname());
PrintWriter out = response.getWriter();
out.print("OK");
out.flush();
out.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
ois.close();
}
}
}
}

在服务端我们使用一个Servlet来接收客户端传来的数据,在doPost方法中,我们使用ObjectInputStream来接收android传来的对象,获得Person对象之后我们将其中的值打印出来,同时返回给客户端一个OK。这里需要注意的一点是服务端的Person类要和客户端的Person类一模一样(包括包名),否则会有异常,如下图:

使用HttpURLConnection实现在android客户端和服务器之间传递对象

好了,经过上面几个步骤我们就可以给将android客户端的一个Object传递到服务器上了,就这么简单,省去了将对象转为json或者XML的麻烦。

android端Demo下载https://github.com/lenve/TransObj

服务端Demo下载http://download.csdn.net/detail/u012702547/9263967

使用HttpURLConnection实现在android客户端和服务器之间传递对象的更多相关文章

  1. Android客户端与服务器之间传递json数据

    在服务器与客户端之间通信,json数据是一种常用格式,本文主要在服务器端构建数据,在客户端接收显示,并且在listview上显示出来 服务器端的构建 简单的javabean与返回结果函数与插入函数略过 ...

  2. Android客户端与服务器

    就是普通的服务器端编程,还不用写界面,其实还比服务器编程简单一些.跟J2EE一样的服务器,你android这一方面只要用json或者gson直接拿数据,后台的话用tomcat接受请求操作数据,功能不复 ...

  3. android客户端向服务器发送请求中文乱码的问

    android客户端向服务器发送请求的时候,并将参数保存到数据库时遇到了中文乱码的问题: 解决方法: url = "http://xxxx.com/Orders/saveorder.html ...

  4. Android客户端与服务器交互方式-小结

    最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要 ...

  5. Android:客户端和服务器之间传输数据加密

    Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码:另一类是其他比较重要的,但是可以逆向解密的数据. 第一类:密码类的数据,为了让用户 ...

  6. Java开发之使用websocket实现web客户端与服务器之间的实时通讯

    使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 <%@ page language="java" contentType=& ...

  7. Android中如何使用Intent在Activity之间传递对象&lbrack;使用Serializable或者Parcelable&rsqb;

    http://blog.csdn.net/cjjky/article/details/6441104 在Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSeri ...

  8. ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象《二》

    ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象<一> 上一篇文章写到对象之间传输使用线程方式 ,无法使用监听方式,最近解决了使用监听方式接收对象,本次使用配置文件方 ...

  9. Android之Activity之间传递对象

    在非常多时候,我们须要在Activity之间传递对象,比方当你点击了某列表的item,须要传递给下一个Activity该对象,那我们须要该怎么做呢? Android支持两种传递对象的方式.一种是bun ...

随机推荐

  1. 远程连接Oracle时出现ORA-01034 和ORA-27101 的解决办法

    服务器本地连接自身没有问题,但远程客户端连接时报错,远程客户端使用tnsping也没有问题. cmd->tnsping 192.168.56.101:1521/ora11gR2 tnsping命 ...

  2. 《Inside UE4》-0-开篇

    <Inside UE4>-0-开篇 InsideUE4   前言 VR行业发展是越来越火热了,硬件设备上有HTC VIVE,Oculus rift,PS VR,各种魔镜:平台上有Steam ...

  3. nandsim ubi nand nor

    nandsim模拟mtd测试UBI模块 利用nandsim挂载ubi文件系统 MTD设备及JFFS2, UBIFS文件系统的使用简介 首先需要安装mtd_utils工具: sudo apt-get i ...

  4. NDIS小鱼防火墙之拦截指定QQ登录

    因为QQ窗口是自绘窗口,gif录制软件不能正常录制到窗口,我就截图功能把窗口显示出来. 下面我的演示,我登录2个QQ号,一个被我指定拦截,让他不能够登录.另一个却可以正常的工作..看我的COOL的演示 ...

  5. &lbrack;liu yanling&rsqb;测试小结

    编写测试用例,业务了解是基础,结合业务编写测试用例,重要的逻辑一定要覆盖

  6. Code Complete阅读笔记&lpar;三&rpar;

    2015-05-26   628   Code-Tuning Techniques    ——Even though a particular technique generally represen ...

  7. 【Android】TextView跑马灯效果

    老规矩,先上图看效果. 说明 TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果. 其实,TextView ...

  8. 【leetcode76】Intersection of Two Arrays II

    题目描述: 给定两个数组求他们的公共部分,输出形式是数组,相同的元素累计计数 例如: nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2]. 原文描述: G ...

  9. linux-centerOs6&period;8安装nginx与配置

    一:安装nginx 1.安装gcc(命令:yum install gcc)备注:可以输入gcc -v查询版本信息,查看是否自带安装 2.安装pcre(命令:yum install pcre-devel ...

  10. 【Beta阶段】第八次Scrum Meeting!

    每日任务内容: 本次会议为第八次Scrum Meeting会议~ 由于本次会议项目经理身体不适,未参与会议,会议精神由卤蛋代为转达,其他同学一起参与了会议 队员 昨日完成任务 明日要完成任务 刘乾 今 ...