Android使用HttpURLConnection通过POST方式发送java序列化对象
使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互。
Android端代码:
public String SendDataByPost(String urlStr){
URL url = null;
String result="";//要返回的结果
try {
url=new URL(urlStr);
HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(2000);//设置连接超时时间,单位ms
httpURLConnection.setReadTimeout(2000);//设置读取超时时间,单位ms
//设置是否向httpURLConnection输出,因为post请求参数要放在http正文内,所以要设置为true
httpURLConnection.setDoOutput(true);
//设置是否从httpURLConnection读入,默认是false
httpURLConnection.setDoInput(true);
//POST请求不能用缓存,设置为false
httpURLConnection.setUseCaches(false);
//传送的内容是可序列化的
//如果不设置此项,传送序列化对象时,当WEB服务默认的不是这种类型时,会抛出java.io.EOFException错误
httpURLConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
//设置请求方法是POST
httpURLConnection.setRequestMethod("POST");
//连接服务器
httpURLConnection.connect();
//getOutputStream会隐含调用connect(),所以不用写上述的httpURLConnection.connect()也行。
//得到httpURLConnection的输出流
OutputStream os= httpURLConnection.getOutputStream();
//构建输出流对象,以实现输出序列化的对象
ObjectOutputStream objOut=new ObjectOutputStream(os);
//dataPost类是自定义的数据交互对象,只有两个成员变量
dataPost data= new dataPost("Tom",null);
//向对象输出流写出数据,这些数据将存到内存缓冲区中
objOut.writeObject(data);
//刷新对象输出流,将字节全部写入输出流中
objOut.flush();
//关闭流对象
objOut.close();
os.close();
//将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端,并获取访问状态
if(HttpURLConnection.HTTP_OK==httpURLConnection.getResponseCode()){
//得到httpURLConnection的输入流,这里面包含服务器返回来的java对象
InputStream in=httpURLConnection.getInputStream();
//构建对象输入流,使用readObject()方法取出输入流中的java对象
ObjectInputStream inObj=new ObjectInputStream(in);
data= (dataPost) inObj.readObject();
//取出对象里面的数据
result=data.password;
//输出日志,在控制台可以看到接收到的数据
Log.w("HTTP",result+" :by post");
//关闭创建的流
in.close();
inObj.close();
}else{
Log.w("HTTP","Connction failed"+httpURLConnection.getResponseCode());
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
package com.example.com.example.data; import java.io.Serializable; //实现Serializable接口,使dataPost可序列化。
public class dataPost implements Serializable { /*指定序列化版本号,保证序列化版本的一致性。在服务器端,JVM会把传来的字节流的
serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认
为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。*/
private static final long serialVersionUID = 1L; String name;
String password;
public dataPost(String name, String password) {
this.name = name;
this.password = password;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }
服务端程序:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream in=request.getInputStream();
dataPost datap = null;
ObjectInputStream obj=new ObjectInputStream(in);
try {
datap= (dataPost) obj.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
obj.close();
}
response.setContentType("application/x-java-serialized-object");
OutputStream out=response.getOutputStream();
ObjectOutputStream outObj=new ObjectOutputStream(out);
datap.setPassword("9964646");
outObj.writeObject(datap);
outObj.flush();
outObj.close();
}
注意事项:
1、客户端url如果有中文会出现乱码,需要对url进行编码。
例如:
String url="你好";
URI uri=new URI(url,false,"utf-8");
url=uri.toString();
2、在Android主程序中调用SendDataByPost()方法时,要重新开一个线程,否则会阻塞主线程。
new Thread(new Runnable() {
@Override
public void run() {
HTTPURLConnectionGETData getData = new HTTPURLConnectionGETData();
String result=getData.SendStringDataByPost(serverIP1);
if("".equals(result)){
}else{
Log.i("HTTP",result);
}
}
}).start();
3、Android端dataPost类的包名和server端dataPost的包名必须一致,否则就会出现找不到该类的异常。
java.lang.ClassNotFoundException: com.example.com.example.data.dataPost
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
4、Android端dataPost类的包名和server端dataPost的序列化版本必须一致,否则会报出serialVersionUID不同的错误。
Servlet.service() for servlet [com.test.stream.testStream] in context with path [/campus2] threw exception
java.io.InvalidClassException: com.example.com.example.data.dataPost; local class incompatible:
stream classdesc serialVersionUID = -1197271749879367300, local class serialVersionUID = -3085829960977977003
解决方法:
在两端的dataPost类中显式的指定序列化版本号,一般通过添加private static final long serialVersionUID = 1L实现。
Android使用HttpURLConnection通过POST方式发送java序列化对象的更多相关文章
- Java 序列化 对象序列化和反序列化
Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制 ...
- java序列化对象 插入、查询、更新到数据库
java序列化对象 插入.查询.更新到数据库 : 实现代码例如以下: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...
- Java 序列化对象工具类
SerializationUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.Byt ...
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- Java序列化对象-字符串转换
package com.test; import com.alibaba.fastjson.JSON; import org.junit.Test; import java.io.ByteArrayI ...
- Java序列化对象为字符串并将字符串反序列化为对象
对象的序列化与反序列化其实就是将对象的状态保存下来,一般是保存到文件中,但是其实更常用的是将对象序列化为字符串保存到数据库中,然后在需要读取对象的情况下将字符串反序列化为对象. 可以序列化的类必须 ...
- java序列化对象为什么要定义serialversionUID值?
SerialVersionUid,简言之,其目的是序列化对象版本控制,有关各版本反序列化时是否兼容.如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassExcep ...
- Serializable详解(1):代码验证Java序列化与反序列化
说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...
- java 序列化时排除指定属性
java 序列化对象如何排除指定属性呢? java 中序列化对象有多种方式:struts2 ,jackson,json-lib (1)使用struts2 json插件 依赖的jar包:struts2- ...
随机推荐
- 通过寄生组合式继承创建js的异常类
最近项目中在做js的统一的异常处理,需要自定义异常类.理想的设计方案为:自定义一个异常错误类BaseError,继承自Error,然后再自定义若干个系统异常,例如用户取消异常.表单异常.网络异常,这些 ...
- co.js - 让异步代码同步化
近期在全力开发个人网站,并且又沉淀了一些前后端的技术.近期会频繁更新. 这篇文章首发于我的个人网站:听说 - https://tasaid.com/,建议在我的个人网站阅读,拥有更好的阅读体验. 这篇 ...
- 实用的60个CSS代码片段
1.垂直对齐 如果你用CSS,则你会有困惑:我该怎么垂直对齐容器中的元素?现在,利用CSS3的Transform,可以很优雅的解决这个困惑: .verticalcenter{ position: re ...
- .NET 扩展方法 (二)
上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类 ...
- C#基础知识三之new关键字
运算符 new一个Class时,new完成了两方面内容:一是调用new class命令来为实例在托管堆中分配内存;二是调用构造函数来实现对象初始化. 修饰符 显示隐藏从基类继承来的成员.虽然可以不用n ...
- jQuery美女幻灯相册轮播源代码
体验效果:http://hovertree.com/texiao/jquery/ 本幻灯片包含小图列表和大图轮播,包含图片标题和详细介绍,详细介绍字数可以很多,每张图片包含链接,可以实现跳转 HTML ...
- 【Win10开发】自定义标题栏
UWP 现在已经可以自定义标题栏了,毕竟看灰色时间长了也会厌烦,开发者们还是希望能够将自己的UI做的更加漂亮,更加与众不同.那么废话不多说,我们开始吧! 首先要了解ApplicationViewTit ...
- Lock、ReentrantLock、synchronized、ReentrantReadWriteLock使用
先来看一段代码,实现如下打印效果: 1 2 A 3 4 B 5 6 C 7 8 D 9 10 E 11 12 F 13 14 G 15 16 H 17 18 I 19 20 J 21 22 K 23 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】一.通讯机制
1.1 应用场景 通讯平台的交互对象包括两方面:第一.与硬件产品交互.第二.与软件产品交互.基本这两方面考虑,通讯平台一般会应用在两个场景: 1)通讯平台应用在PC机上 主要应用在自动站的工控机 ...
- Javascript:Javascript数据类型详解
要成为一个优秀的前端工程师,系统的学习Javascript,有夯实的Javascript基础,以及对语言本身的深刻的理解,是基本功.从Javascript数据类型开始,我将对Javascript知识体 ...