socket中客户端readObject 得到的对象不是服务端发送的是什么情况?

小凡没有笑 2015-04-24 08:17:42
情景:
现有一个服务端,发送一个商品列表给客户端,客户端在接收到列表后发送修改数量请求,服务端收到修改请求后,修改相应商品的数量,并再次发送修改后的商品列表给客户端。此时问题出现了!

服务端的输出内容为:


而客户端的输出内容为:


以下贴出服务端和客户端的代码(为了方便大家浏览,只贴了重要部分,详细内容可下载之后的附件):
服务端:
		ServerSocket ss = new ServerSocket(10000);
Socket socket = ss.accept();
//输出和输入流
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

//商品的集合
List<Goods> goods = new ArrayList<Goods>();
//添加一个商品
goods.add(new Goods(1, "北方", 10));

//new 一个数据传输类
Datas data = new Datas();
//将商品列表放进传输类当中
data.obj = goods;
//在服务端打印商品列表
pirntList(goods);
//将数据传输类发送给客户端
oos.writeObject(data);

//发送完成后修改服务端的商品列表中的商品数量
System.out.println("发送给客户端后修改数量");
goods.get(0).count = 20;

//重新发送
data.obj = goods;
//再次打印
pirntList(goods);

//再次发送给客户端
oos.writeObject(data);

//等待客户端
Thread.sleep(10000000);

客户端:
		Socket socket = new Socket("localhost", 10000);

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(
socket.getOutputStream());

//用来接收商品的列表
List<Goods> goods = null;

//读取服务端发送过来的Datas
Datas data = (Datas) ois.readObject();
//将Datas中的obj转换成商品列表
goods = (List<Goods>) data.obj;
System.out.println("第一次的列表:");
//打印
pirntList(goods);

//再次读取服务端发送过来的Datas
data = (Datas) ois.readObject();
//这次是服务端修改后的商品列表
goods = (List<Goods>) data.obj;
System.out.println("第二次的列表:");
pirntList(goods);

Datas:
public class Datas implements Serializable{
public Object obj = null;
}

为了方便同学们测试,附上原版代码:
http://pan.baidu.com/s/1pJwra7x
...全文
298 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小凡没有笑 2015-04-27
  • 打赏
  • 举报
回复
找到问题所在了,在父类发送前使用 ObjectOutputStream 的 reset 方法 或者 使用writeUnshared 代替 writeObject,就可以让每次 write 的对象都是一个单独对象。(怪我JDK看得不仔细!之前的深拷贝也可以解决,不过跟这个比起来就比较麻烦了)
小凡没有笑 2015-04-26
  • 打赏
  • 举报
回复
怎么没人
小凡没有笑 2015-04-24
  • 打赏
  • 举报
回复
自己解决了,客户端在接收时要用深拷贝以后就没问题了,可是为啥呀?

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧