Java通过线程中的套接字发送对象

时间:2013-12-19 17:31:11

标签: java multithreading sockets

我正在做小型游戏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中,我们改变了完全不同的对象......我非常绝望,我不知道自己做错了什么......

1 个答案:

答案 0 :(得分:3)

出于Javadoc中给出的原因,您需要致电ObjectOutputStream.reset()或使用writeUnshared(),。流通过每次返回相同的对象来保存对象图的完整性。这些方法绕过了。

请注意,您需要单独捕捉EOFException,并在捕获它时突破您的阅读循环。应记录任何其他异常。