编辑:我在这里上传了一些源代码: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.
等等。
这是故事(简而言之)
服务器while(true)为客户端循环,接受它们,如果接受的客户端退出服务器的inputStream,则抛出一个Socket Exception,我捕获并用它来运行这个位代码:
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);
如果一切顺利,将String作为握手进行交换,用户将获得验证,然后输入和输出将被转发以由不同的线程处理。
但是当它没有在“input = new 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)
完成写入后,在输出流中,刷新()流。另外,检查您的密码是否在代码中正确初始化/重置
答案 1 :(得分:-1)
也许您需要关闭ObjectOutputStream代码; out.close();