2014-11-07 14 views
-1

我知道這個問題以前已經問過,但我不知道如何用ObjectOutputStream多次發送一個對象,我試過人們在這個論壇上說過的話。 事情是我正在開發一個使用多線程和套接字的Java遊戲,我已經畫出了兩條蛇,但是我只能將一條蛇從一條蛇發送到另一條蛇,所以,當我試圖再發送一次我得到和StreamCorruptedException。這裏是我的代碼:在Java中重置一個ObjectOutputStream

這種方法是在我的Snake類中,我已經讀過ObjectOutputStrean不能被初始化多次,但是「我怎樣才能發送一次以上的蛇對象?」,它已經變得非常困惑於我:

public void sendSnake() 
{ 
    try 
    { 
     outputStream=socket.getOutputStream(); 
     oos=new ObjectOutputStream(outputStream); 
     oos.writeObject(snakeBody); 
    }catch(IOException ioe) 
    { 
     ioe.printStackTrace(); 
    }  
} 

這是我的代碼的一部分是問題。謝謝。

下面是我在做什麼,而中環一做:

try 
{ 
     this.sendSnake(); 
     this.receiveListSnakes(); 

      for(int i=0; i<listaSnakes.size(); i++) 
      { 
       for(int j=0; j<listSnake.get(i).tam(); j++) 
       { 
        mostrar(listSnake.get(i).take(j).part); //this is for display de snake 
       } 
      } 
}catch(IOException ioex) 
{ 
    ioex.printStackTrace(); 
} 

if(op.equals("up")) 
{ 
    posy--; 
    ... 


public Snake(JFrame screen) 
{ 
     //above I have created the Socket 
     socket=new Socket(ipClient, port); 


     outputStream=socket.getOutputStream(); 
     oos=new ObjectOutputStream(outputStream); 

} 

回答

1

你可以構建ObjectOutputStream一次,保存引用作爲一個字段。另外,你應該flush()。假設你有一個類Snake我會通過傳遞socket.getOutputStream()

private ObjectOutputStream oos; 
public Snake(OutputStream os) { 
    oos = new ObjectOutputStream(os); 
} 

public void sendSnake() 
{ 
    try { 
    oos.writeObject(snakeBody); 
    } catch(IOException ioe) { 
    ioe.printStackTrace(); 
    } finally { 
    oos.flush(); 
    } 
} 

構建然後你就可以調用sendSnakeSnake實例多次,

Snake s = new Snake(socket.getOutputStream()); 
s.sendSnake(); 
s.sendSnake(); 
+0

這是一個好主意,但是當我這樣做時,蛇被發現處於相同的狀態,即我的蛇被髮送到相同的位置,因爲OutoutStream只創建一次:C – Pepe 2014-11-07 03:22:50

+0

@Pepe也許你應該更新你的'Snake'在第二次調用'sendSnake()'之前。你沒有包含太多的代碼。但正如你一再指出你應該真的創建'OutputStream'只有一次。 – 2014-11-07 03:36:39

+0

我已經包含了更多的代碼,當我打電話給sendSnake函數時,我收到了遊戲中的蛇的列表,然後我進行了必要的操作來移動蛇的每一次迭代,我發送蛇的新位置 – Pepe 2014-11-07 03:49:02

0

必須使用相同ObjectOutputStream爲插座的生活。更準確地說,你必須成對使用ObjectOutputStreamObjectInputStream:當你構造一個時,你必須在對等體構造另一個。然而,這基本上不可能協調,因此適用單一的ObjectInput/OutputStream規則。

Snake不應該自己發送,不應該用Socket [或OutputStream任何形式構造或構造自己,這裏與其他答案相反]。發送Snake(或其他任何東西)的實體應擁有套接字和輸出流,並且應該寫入。

+0

在我的蛇類中我有一個來自queueSnake類的對象,所以,我發送queueSnake對象不是蛇,蛇是我正在使用我的queueSnake對象的類,我一直很困惑這個 – Pepe 2014-11-07 04:11:47

+0

聲音更加顛倒了很長時間。 Snake不應該知道它所在的隊列,它正在發送的套接字,還是用於發送它的ObjectOutputStream。 – EJP 2014-11-07 04:54:12

相關問題