2011-01-07 11 views
7

Tengo un servidor Tomcat transmitiendo datos a un cliente Java a través de http. Está copiando bytes de un archivo al outputtream de HTTPServletResponse en un servlet.Si un servidor Tomcat dice "Cliente abortado", y el cliente dice "EOF prematuro", ¿quién tiene razón?

Un cliente utiliza HttpURLConnection para conectar y leer los datos.

A veces todo está bien, otras veces el cliente y el servidor lanzan una excepción.
El cliente dice que hay un "EOF prematuro".
El servidor reclama "ClientAbortException".

¿No es solo una de las opciones anteriores?

CLIENTE:

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) 

SERVIDOR:

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

Si puede reproducir el problema consistentemente, considere usar una herramienta de supervisión de red como Wireshark, que le permitirá ver exactamente qué pasó –

Respuesta

11

Ellos no son mutuamente excluyentes.

Esta situación puede ocurrir y ocurrirá si el socket se cierra inesperadamente. Por ejemplo, considere lo que sucedería si su firewall acabara de cerrar el socket. Desde el punto de vista del servidor, cuando intentaba escribir datos, el socket parecía cerrado, y se activaba la ClientAbortException. Desde el punto de vista del cliente, la siguiente lectura de bytes fallaría, causando la excepción final prematura.

+0

¿Hay alguna manera de manejar este tipo de errores? Tengo el mismo problema con websockets, como se describe aquí: http://stackoverflow.com/questions/25662371/websocket-error-by-closing-a-page-via-browser-an-established-connection-was-ab – vdenotaris

1

Estaba teniendo un problema similar hace un tiempo y lo resolví al no usar BufferedReader, pero leyendo un byte a la vez y puse la lectura en un try-catch para EOFException. Espero que esto ayude.

Cuestiones relacionadas