我正在做小型游戏Tron Bikes。
我有 MainFrame类
Bike bike1, bike2;
private void startGameAsServer(){
bike1 = new Bike();
bike2 = new Bike();
communication.sendBike(bike1);
communication.sendBike(bike2);
}
...
public synchronized void receiveBike(Bike receive){
//depends if I'm server or client I save receive to bike1 or bike2
}
...
第二课沟通
...
ObjectOutputStream output = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream input = new ObjectInputStream(client.getInputStream());
...
public void sendBike(Bike send){
try {
output.writeObject(send);
output.flush();
System.out.println("Send bike");
} catch (IOException ex) {
}
}
...
private void listen(){
listening = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Bike readBike = (Bike)input.readObject();
System.out.println("Receive bike");
MainFrame.getInstance().receiveBike(readBike);
} catch (IOException | ClassNotFoundException ex) {
break;
}
}
}
});
listening.start();
}
...
当我开始游戏时,它运行正常。在服务器上创建两个自行车,发送到客户端,然后开始游戏。但是当我在客户端转向侧面时,我将一辆自行车送回服务器,这就是问题。
在方法服务器 receiveBike 中,bike1和bike2为空......如果我写入bike1或bike2,则没有任何动静。甚至很多次,来自bike1和bike2的数据被加载到游戏面板上。看起来,数据是从旧对象加载的。
在方法receiveBike中,我们改变了完全不同的对象......我非常绝望,我不知道自己做错了什么......
答案 0 :(得分:3)
出于Javadoc中给出的原因,您需要致电ObjectOutputStream.reset()
或使用writeUnshared(),
。流通过每次返回相同的对象来保存对象图的完整性。这些方法绕过了。
请注意,您需要单独捕捉EOFException
,并在捕获它时突破您的阅读循环。应记录任何其他异常。