如果Tomcat服务器显示“Client Aborted”,并且客户端显示“Premature EOF”,那么谁是对的?

时间:2011-01-07 19:58:26

标签: java http exception tomcat

我有一个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

2 个答案:

答案 0 :(得分:11)

它们不是相互排斥的。

如果套接字意外关闭,可能会发生这种情况。例如,考虑一下如果防火墙刚刚终止套接字会发生什么。从服务器的角度来看,当它尝试写入数据时,套接字将显示为关闭状态,并且将触发ClientAbortException。从客户端的角度来看,下一次读取字节将失败,从而导致过早结束异常。

答案 1 :(得分:1)

前一段时间我遇到了类似的问题,我通过不使用BufferedReader解决了这个问题,但是一次只读取一个字节并将读取放在try-catch中进行EOFException。希望这会有所帮助。