2013-12-19 93 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