2010-01-31 49 views
1

我正在構建客戶端 - 服務器應用程序。現在我想用此代碼將消息從客戶端轉發到所有其他客戶端:Java無效流標頭:7371007E

ArrayList<User> usrs = _usrHandler.getUsers(); 
for(User usr : usrs) { 
    if(!usr.getSocket().equals(_connection)) { 
     usr._oOut.writeObject(new CommunicationMessage(this._comMsg.getMessage(), CommunicationMessage.MSG, 
                this._comMsg.getUser())); 
} 
} 

在客戶端,程序正在偵聽消息。它引發此異常:

java.io.StreamCorruptedException: invalid stream header: 7371007E 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 
    at Connection$MessageListener.run(Connection.java:126) 
    at java.lang.Thread.run(Thread.java:637) 

消息監聽:

   while(this._loop) { 
this._comMsg = (CommunicationMessage) this._dataInput.readObject(); 

SimpleAttributeSet attr = new SimpleAttributeSet(); 
attr.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE); 
attr.addAttribute(StyleConstants.CharacterConstants.Foreground, _comMsg.getUser().getColor()); 

messageClient.addMessage(_comMsg.getUser().getNickName() + ": ", attr); 
messageClient.addMessage(_comMsg.getMessage(), _comMsg.getUser().getColor()); 

_comMsg = null; 
} 

是否有人看到錯誤?

回答

5

你可能已經得到了你流的扭曲。

當您構造一個ObjectInputStream時,構造函數會從流中讀取前兩個字節,以期望它們成爲應該出現在對象流中的「魔術值」。如果他們不在那裏,它會拋出StreamCorruptedException(這全部在ObjectInputStream源代碼中)。

因此,看起來你會在ObjectInputStream中包裝InputStream,事實上從連接的另一端傳出的數據實際上並不是一個對象流。也許它仍然在發送以前的通信數據。

+2

我現在看到我的錯誤。我改變了構造偵聽器線程的方式,但沒有意識到'InputStream'仍然是在run()方法中構建的。謝謝! – dododedodonl 2010-01-31 13:14:12

相關問題