关于对象流两端的数据不一致的问题:
下图为服务器端收发数据时的状态:此时players列表中有两个对象但是到客户端接收时,却只有一个对象了,经过多次测试,发现每次只有GameMessage这个类有问题,所以排除多种可能,最终确定是序列化时的问题。
原因如下:
GameMessage这个类中有players这个ArrayList对象的引用,该引用在调用带参数的构造方法时被赋值,以下该构造函数:
public GameMessage(ArrayList<Player> players, Point food) { super(); //this.players = players; //this.players.addAll(players); for(Player player : players) { this.players.add(new Player(player)); } //this.food = food; this.food = new Point(food); }
没修改前是把本类中的引用指向了堆中的原有对象,那么此时在堆中只有唯一的一个对象,在对象流进行多次序列化时,会认为是同一个对象在进行序列化,从而不会多次序列化,而是只输出第一次序列化时的那个编号,那么每次收到时其实只能反序列化出第一次发送过来的那个players列表了!
修改之后,每次赋值都新建一个对象,那么每次序列化时JVM都会重新序列化players列表,此时输出端的数据就正常了。
具体原理如下:(java疯狂讲义)

服务器端发送数据时状态(此时players列表中有两个玩家):
此时客户端接受处在等待(卡在read语句):
客户端接收到数据时的状态(此时的players列表只有一个玩家了):

