我有一个Tomcat服务器通过http将数据流传输到Java客户端。它将字节从文件复制到servlet中的HTTPServletResponse的输出流。
客户端使用HttpURLConnection连接和读取数据。
有时一切都很好,有时候客户端和服务器都会抛出异常 客户说有“早产EOF” 服务器声称“ClientAbortException”。
不仅仅是上述之一吗?
客户端:
java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:234)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:662)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2669)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2664)java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:234)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:662)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2669)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2664)
服务器
ClientAbortException: java.io.IOException
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
...
Caused by: java.io.IOException
at org.apache.coyote.ajp.AjpAprProcessor.flush(AjpAprProcessor.java:1223)
at org.apache.coyote.ajp.AjpAprProcessor$SocketOutputBuffer.doWrite(AjpAprProcessor.java:1310)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 23 more
答案 0 :(得分:11)
它们不是相互排斥的。
如果套接字意外关闭,可能会发生这种情况。例如,考虑一下如果防火墙刚刚终止套接字会发生什么。从服务器的角度来看,当它尝试写入数据时,套接字将显示为关闭状态,并且将触发ClientAbortException。从客户端的角度来看,下一次读取字节将失败,从而导致过早结束异常。
答案 1 :(得分:1)
前一段时间我遇到了类似的问题,我通过不使用BufferedReader
解决了这个问题,但是一次只读取一个字节并将读取放在try-catch中进行EOFException。希望这会有所帮助。