編輯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)是不同的)。但它沒有結果。我不知道爲什麼會發生這種情況。
編輯:我還發現我的服務器斷開,如果我連接第二個客戶端...
如果有人知道任何事情來幫助我,在此先感謝。
嘗試在讀回數據之前刷新輸出流 –
「如果接受的客戶端退出服務器的inputStream將引發Socket異常」。等一下。它不應該那樣做。拋出什麼SocketException?什麼信息? – EJP
@EJP它拋出一個** EOFException **,因爲流在另一邊被切斷。 – Gelunox