【问题标题】:If a Tomcat server says "Client Aborted", and the client says "Premature EOF", who is right?如果 Tomcat 服务器说“Client Aborted”,而客户端说“Premature EOF”,谁是对的?
【发布时间】:2011-01-07 19:58:25
【问题描述】:

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

【问题讨论】:

  • 如果您能始终如一地重现该问题,请考虑使用网络监控工具,例如 Wireshark,它可以让您准确了解发生了什么

标签: java http exception tomcat


【解决方案1】:

它们并不相互排斥。

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

【讨论】:

【解决方案2】:

我之前遇到过类似的问题,我通过不使用BufferedReader 而是一次读取一个字节并将读取的内容放入 EOFException 的 try-catch 来解决它。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多