2013-12-19 92 views
1

我正在做小型游戏Tron自行车。Java通过线程中的套接字发送对象

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什么都没有发生。即使在很短的时间内,骑自行车1和自行车2的数据也被加载以绘制游戏面板。看起来,这些数据是从旧对象加载的。

如同方法receiveBike我们改变了完全不同的对象......我很绝望,我不知道我做错了什么......

+0

为什么sendBike()是静态的?你可以发布这种方法的代码? run()方法中的输入是什么? – JosefN

+0

'startGameAsServer()'的第四行,你的意思是bike2,而不是bike1? – asaini007

+0

对不起,编辑。是的,我的意思是bike2,sendBike不是静态的,应该有小的'c'连接... – Arxeiss

回答

3

你需要调用ObjectOutputStream.reset()或使用writeUnshared(),为在Javadoc中给出的原因。该流通过每次返回相同的对象来节省对象图的完整性。这些方法规避了这一点。

注意你需要单独捕捉EOFException,当你捕捉到它时就跳出你的阅读循环。应记录任何其他异常。

+0

谢谢,但这并不能解决我的问题..我的问题是,在方法'receiveBike',这是从函数'listen'中的线程调用,我看不到变量'bike1'和'bike2',并且我写入它们,MainFrame中的其他函数看到旧函数,但是在此函数中的线程看到“new”,null第一次,然后我写了什么......我为bike1和bike2设置了volatile,为方法同步但它仍然不起作用... – Arxeiss

+0

“看不见”是什么意思?有没有可能的变量范围问题? – EJP

+0

抱歉,你的帮助不好......“不能看到”我认为,在'bike1'和'bike2'中是空的,但在它被初始化之前。我不明白为什么。现在,从服务器到客户端的工作很好。但不是相反的方式。但是,谢谢,现在我移动一点 – Arxeiss