2013-06-28 42 views
-1

編輯Java StreamCorruptedException無效流頭:我上傳了一些源代碼在這裏:http://stabbedbit.com/MCapp/初始化所有其他時候

我有我的流客戶端拋出一個StreamCorruptedException每個其他時間的問題。

例如:

first time: works fine -> exit client application. 
second time: StreamCorruptedException -> exit client application. 
third time: works fine -> exit client application. 
forth time: StreamCorruptedException -> exit client application. 

等等。

這裏的故事(簡稱)

服務器,而(真)環路客戶,接受他們,如果被接受的客戶端將退出服務器實例的InputStream拋出一個Socket異常,我抓住並用它來運行該位碼:

if(dataSender != null) dataSender.stop(); 
if(dataReceiver != null) dataReceiver.stop(); 

try { if(output != null) output .close(); } catch(IOException e) { streamNotClosed("output"); } 
try { if(input != null) input  .close(); } catch(IOException e) { streamNotClosed("input"); } 
try { if(cryptOut!= null) cryptOut .close(); } catch(IOException e) { streamNotClosed("encrypted output"); } 
try { if(cryptIn != null) cryptIn .close(); } catch(IOException e) { streamNotClosed("encrypted input"); } 
try { if(clientSocket != null) clientSocket.close(); } 
catch(IOException e){ logger.warning(socketNotClosed); } 

這一切似乎做工精細

的客戶端和服務器都使用這段代碼初始化流:

cryptOut = new CipherOutputStream(clientSocket.getOutputStream(), protocol.encoder); 
output = new ObjectOutputStream(cryptOut); 

cryptIn = new CipherInputStream(clientSocket.getInputStream(), protocol.decoder); 
input = new ObjectInputStream(cryptIn); 

如果一切順利一個字符串交換爲握手,用戶得到驗證,然後輸入和輸出得到轉發由單獨的線程處理。

但是,當它不會引發以下錯誤「輸入=新的ObjectInputStream(cryptIn);」

我試圖通過停止線程時調用垃圾收集器並關閉流解決這個

java.io.StreamCorruptedException: invalid stream header: 81C69F13 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) 
    at com.stabbedbit.minecraftRemoteAdmin.desktop.connection.ConnectionManager.run(ConnectionManager.java:89) 
    at java.lang.Thread.run(Thread.java:722) 

(每次它拋出的代碼(81C69F13)是不同的)。但它沒有結果。我不知道爲什麼會發生這種情況。

編輯:我還發現我的服務器斷開,如果我連接第二個客戶端...

如果有人知道任何事情來幫助我,在此先感謝。

+0

嘗試在讀回數據之前刷新輸出流 –

+0

「如果接受的客戶端退出服務器的inputStream將引發Socket異常」。等一下。它不應該那樣做。拋出什麼SocketException?什麼信息? – EJP

+0

@EJP它拋出一個** EOFException **,因爲流在​​另一邊被切斷。 – Gelunox

回答

0

在完成寫入之後,在您的輸出流中,flush()流。此外,請檢查您的代碼是否已在代碼中正確初始化/重置

-1

也許您需要關閉ObjectOutputStream代碼; out.close();

+1

這並不能解釋爲什麼一個流頭是無效的。 – EJP