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

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

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

当我们点击注册按钮的时候,将用户的注册信息通过一个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类一模一样(包括包名),否则会有异常,如下图:

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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

时间: 2024-08-08 04:35:25

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

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

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台.传输数据格式标准.交互方便. 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API.而下面的几种方式就是从这两种协议扩展出来的:webservices soap.SSH的JSON(可参考:该链接

android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)

在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包 首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包 然后新建android项目 以

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

Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码:另一类是其他比较重要的,但是可以逆向解密的数据. 第一类:密码类的数据,为了让用户放心注册,密码类的数据的加密一般都是经过双重加密的,第一重加密使用不可逆的MD5算法加密,第二重加密是可逆的加密,常见的可逆加密有对称加密和非对称加密.上述不可逆的意思就是一旦加密就不能反向得到密码原文,一般用来加密用户密码,app的服务器端一般存储的也都是密文密码,不然用户就太危险了,app的运营

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

使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu

Android之Activity之间传递对象

在很多时候,我们需要在Activity之间传递对象,比如当你点击了某列表的item,需要传递给下一个Activity该对象,那我们需要该怎么做呢? Android支持两种传递对象的方式,一种是bundle.putSerializable方式,一种是bundle.putParcelable. 那么下面我们就用一个例子来实践Activity传递对象: 1.首先建立两个类,一个Teacher类表示老师,一个Student类表示学生.内容分别如下: <span style="font-size:1

Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

http://blog.csdn.net/cjjky/article/details/6441104 在Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Serializable接口,后面一种方法中的Object要实现Parcelable接口.下面我们以一个完整的例子来说明. 1.新建一个A

序列化和反序列化在浏览器和 Web 服务器之间传递的数据、加密解密

js中数组不能传递到后台,需进行json序列化: var data = new Array(); data.push({para1:name,para2:answer}); string data = JSON.stringify(data) //解析参数 JavaScriptSerializer js = new JavaScriptSerializer(); List<Dictionary<string, string>> answerList = js.Deserialize

借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Parcelable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import android.os.Parcel; import android.os.Parcelable; public cl

借助Intent实现Android工程中Activity之间Java对象的传递——实现Serializable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Serializable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import java.io.Serializable; public class User implements Seria