2012-09-25 73 views
1

我正在開發一個大學生hang子手遊戲。它需要通過套接字,服務器和客戶端。現在遊戲運行良好。Java接收對象套接字

但是當它由兩個人玩,試圖猜測同一個單詞時,我需要知道一個用戶選擇哪個字母,所以我可以在其他用戶GUI上禁用該字母。

所以,我試圖發送一個ID的對象,將禁用另一邊的按鈕,我先sendind消息,警告我會發送一個對象,所以我沒有得到一個例外。

Bur只讀了我發送的前兩個對象,第三個對象我得到一個異常,稱爲java.io.StreamCorruptedException。有人知道爲什麼

Sending: 
    toClient= new DataOutputStream(socketConection.getOutputStream()); 
    toClient.writeBytes("VK_Letra\n"); 
    objectToClient= new ObjectOutputStream(socketConetion.getOutputStream()); 
    objectToClient.writeObject(new Letter()); 
    objectToClient.flush(); 

    Receiving: 
    fromServer = new BufferedReader(new InputStreamReader(socketCliente.getInputStream())); 
    objectFromServer = new ObjectInputStream(socketCliente.getInputStream()); 

public void run(){ 
    String str; 
    try{ 
     while(true){ 
      str = fromServer.readLine(); 

      if(str.equals("VK_Letter")){ 
       Letter l = (Letter) objectFromServer.readObject(); 
       System.out.println(l.getLetter()); 
       button[l.getId()].setEnabled(false); 
      }else{ 
       chat.append(str+ "\n"); 
       chat.setCaretPosition(chat.getDocument().getLength()); 
      } 
     } 
    }catch(IOException | ClassNotFoundException e){ 
     JOptionPane.showMessageDialog(/* Error Message */); 
    } 
} 
+0

請發表您的異常! –

+0

提示:嘗試僅使用一種語言爲您的方法和對象命名,優先使用英語。 paraCliente =葡萄牙語; fromServer = English; –

+0

java.io.StreamCorruptedException – bfagundes

回答

1

我會使用的方法是將所有東西都當作一個對象,以便您只發送和接收對象。然後該對象將指示實際消息以及任何參數或參數或數據。

您正在混淆讀取行和獲取對象。

+0

我將嘗試僅使用ObjectInputStream和ObjectOutputStream,並使用instanceof來區分不同類型的對象(單詞,字母和消息)。謝謝。 – bfagundes

1

混淆的一個常見原因是在同一個流上混合不同的流類型。

你有兩個不同問題的好例子。

  • 您不應在同一個流上使用多個流,例如DataOutptuStream和ObjectOutputStream
  • 您不應該混合二進制和文本流,例如BufferedReader和ObjectInputStream。

解決方案是使用一個,並且只有一個適合您的需求並使用它。