使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互。

Android端代码:

  1. public String SendDataByPost(String urlStr){
  2. URL url = null;
  3. String result="";//要返回的结果
  4. try {
  5. url=new URL(urlStr);
  6. HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
  7.  
  8. httpURLConnection.setConnectTimeout(2000);//设置连接超时时间,单位ms
  9. httpURLConnection.setReadTimeout(2000);//设置读取超时时间,单位ms
  10.  
  11. //设置是否向httpURLConnection输出,因为post请求参数要放在http正文内,所以要设置为true
  12. httpURLConnection.setDoOutput(true);
  13.  
  14. //设置是否从httpURLConnection读入,默认是false
  15. httpURLConnection.setDoInput(true);
  16.  
  17. //POST请求不能用缓存,设置为false
  18. httpURLConnection.setUseCaches(false);
  19.  
  20. //传送的内容是可序列化的
  21. //如果不设置此项,传送序列化对象时,当WEB服务默认的不是这种类型时,会抛出java.io.EOFException错误
  22. httpURLConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
  23.  
  24. //设置请求方法是POST
  25. httpURLConnection.setRequestMethod("POST");
  26.  
  27. //连接服务器
  28. httpURLConnection.connect();
  29.  
  30. //getOutputStream会隐含调用connect(),所以不用写上述的httpURLConnection.connect()也行。
  31. //得到httpURLConnection的输出流
  32. OutputStream os= httpURLConnection.getOutputStream();
  33.  
  34. //构建输出流对象,以实现输出序列化的对象
  35. ObjectOutputStream objOut=new ObjectOutputStream(os);
  36.  
  37. //dataPost类是自定义的数据交互对象,只有两个成员变量
  38. dataPost data= new dataPost("Tom",null);
  39.  
  40. //向对象输出流写出数据,这些数据将存到内存缓冲区中
  41. objOut.writeObject(data);
  42.  
  43. //刷新对象输出流,将字节全部写入输出流中
  44. objOut.flush();
  45.  
  46. //关闭流对象
  47. objOut.close();
  48. os.close();
  49.  
  50. //将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端,并获取访问状态
  51. if(HttpURLConnection.HTTP_OK==httpURLConnection.getResponseCode()){
  52.  
  53. //得到httpURLConnection的输入流,这里面包含服务器返回来的java对象
  54. InputStream in=httpURLConnection.getInputStream();
  55.  
  56. //构建对象输入流,使用readObject()方法取出输入流中的java对象
  57. ObjectInputStream inObj=new ObjectInputStream(in);
  58. data= (dataPost) inObj.readObject();
  59.  
  60. //取出对象里面的数据
  61. result=data.password;
  62.  
  63. //输出日志,在控制台可以看到接收到的数据
  64. Log.w("HTTP",result+" :by post");
  65.  
  66. //关闭创建的流
  67. in.close();
  68. inObj.close();
  69. }else{
  70. Log.w("HTTP","Connction failed"+httpURLConnection.getResponseCode());
  71. }
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. }
  75. return result;
  76. }
  1. package com.example.com.example.data;
  2.  
  3. import java.io.Serializable;
  4.  
  5. //实现Serializable接口,使dataPost可序列化。
  6. public class dataPost implements Serializable {
  7.  
  8. /*指定序列化版本号,保证序列化版本的一致性。在服务器端,JVM会把传来的字节流的
  9. serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认
  10. 为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。*/
  11. private static final long serialVersionUID = 1L;
  12.  
  13. String name;
  14. String password;
  15. public dataPost(String name, String password) {
  16. this.name = name;
  17. this.password = password;
  18. }
  19.  
  20. public String getName() {
  21. return name;
  22. }
  23.  
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27.  
  28. public String getPassword() {
  29. return password;
  30. }
  31.  
  32. public void setPassword(String password) {
  33. this.password = password;
  34. }
  35.  
  36. }

服务端程序:

  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.  
  3. ServletInputStream in=request.getInputStream();
  4. dataPost datap = null;
  5. ObjectInputStream obj=new ObjectInputStream(in);
  6. try {
  7. datap= (dataPost) obj.readObject();
  8. } catch (ClassNotFoundException e) {
  9. e.printStackTrace();
  10. }finally{
  11. obj.close();
  12. }
  13. response.setContentType("application/x-java-serialized-object");
  14. OutputStream out=response.getOutputStream();
  15. ObjectOutputStream outObj=new ObjectOutputStream(out);
  16. datap.setPassword("9964646");
  17. outObj.writeObject(datap);
  18. outObj.flush();
  19. outObj.close();
  20. }

注意事项:

1、客户端url如果有中文会出现乱码,需要对url进行编码。

例如:

  1. String url="你好";
  2. URI uri=new URI(url,false,"utf-8");
  3. url=uri.toString();

2、在Android主程序中调用SendDataByPost()方法时,要重新开一个线程,否则会阻塞主线程。

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. HTTPURLConnectionGETData getData = new HTTPURLConnectionGETData();
  5. String result=getData.SendStringDataByPost(serverIP1);
  6. if("".equals(result)){
  7. }else{
  8. Log.i("HTTP",result);
  9. }
  10. }
  11. }).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序列化对象的更多相关文章

  1. Java 序列化 对象序列化和反序列化

    Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制 ...

  2. java序列化对象 插入、查询、更新到数据库

    java序列化对象 插入.查询.更新到数据库 : 实现代码例如以下: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...

  3. Java 序列化对象工具类

    SerializationUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.Byt ...

  4. android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值

    1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值  env->SetBooleanF ...

  5. Java序列化对象-字符串转换

    package com.test; import com.alibaba.fastjson.JSON; import org.junit.Test; import java.io.ByteArrayI ...

  6. Java序列化对象为字符串并将字符串反序列化为对象

    对象的序列化与反序列化其实就是将对象的状态保存下来,一般是保存到文件中,但是其实更常用的是将对象序列化为字符串保存到数据库中,然后在需要读取对象的情况下将字符串反序列化为对象.   可以序列化的类必须 ...

  7. java序列化对象为什么要定义serialversionUID值?

    SerialVersionUid,简言之,其目的是序列化对象版本控制,有关各版本反序列化时是否兼容.如果在新版本中这个值修改了,新版本就不兼容旧版本,反序列化时会抛出InvalidClassExcep ...

  8. Serializable详解(1):代码验证Java序列化与反序列化

    说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...

  9. java 序列化时排除指定属性

    java 序列化对象如何排除指定属性呢? java 中序列化对象有多种方式:struts2 ,jackson,json-lib (1)使用struts2 json插件 依赖的jar包:struts2- ...

随机推荐

  1. 通过一个模拟程序让你明白ASP.NET MVC是如何运行的

    ASP.NET MVC的路由系统通过对HTTP请求的解析得到表示Controller.Action和其他相关的数据,并以此为依据激活Controller对象,调用相应的Action方法,并将方法返回的 ...

  2. 一步一步拆解一个简单的iOS轮播图(三图)

    导言(可以不看): 不吹不黑,也许是东半球最简单的iOS轮播图拆分注释(讲解不敢当)了(tree new bee).(一句话包含两个人,你能猜到有谁吗?提示:一个在卖手机,一个最近在卖书)哈哈... ...

  3. 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

    一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...

  4. 获取linux服务器基本信息脚本

    为了方便日常运维写的一段简单脚本,用于集中获取服务器操作系统.CPU.内存使用.负载.硬盘使用.网络信息. 脚本比较简单,就不解释了,有兴趣的朋友请自行查看. #!/bin/bash##Name:sy ...

  5. 策略模式 - Strategy

    Strategy Pattern,定义算法家族,分别封装起来,互相之间可替换,此模式让算法的变化不会影响到使用算法的客户端. // 上下文类(Context):用一个ConcreteStratege来 ...

  6. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

  7. GJM :多人在线游戏的设计思路

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  8. UML常用图

    序列图 活动图

  9. Spring(二)__bean的装配

    Bean的装配: 在spring容器内拼凑bean叫做装配.装 配bean的时候,需要告诉容器哪些bean 以及容器如何使用依赖注入将它们配合在一起. 上下文定义文件的根元素是<beans> ...

  10. 实用CSS3的transform实现多种动画效果

    查看效果:http://keleyi.com/a/bjad/b6x9q8gs.htm 以下是代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. ...