2011-01-07 8 views
7

Mam serwer Tomcat przesyłanie strumieniowe danych do klienta Java przez http. Kopiuje bajty z pliku do strumienia wyjściowego HTTPServletResponse w serwlecie.Jeśli serwer Tomcat mówi "Klient Przerwany", a klient mówi "Przedwczesny EOF", kto ma rację?

Klient używa HttpURLConnection do łączenia i odczytu danych.

Czasami wszystko jest w porządku, innym razem zarówno klient, jak i serwer, rzucają wyjątek.
Klient mówi, że istnieje "Przedwczesny EOF".
Serwer zgłasza "ClientAbortException".

Czy nie jest to jedna z powyższych możliwości?

KLIENT:

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) 

SERVER:

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

Jeśli można konsekwentnie odtworzyć problem, należy rozważyć użycie narzędzia do monitorowania sieci, takiego jak Wireshark, które pozwoli zobaczyć dokładnie, co się stało. –

Odpowiedz

11

Oni nie wykluczają się wzajemnie.

Ta sytuacja może i będzie występować, jeśli gniazdo zostanie nieoczekiwanie zamknięte. Rozważmy na przykład, co by się stało, gdyby zapora sieciowa właśnie zakończyła gniazdo. Z punktu widzenia serwera, gdy próbowano zapisywać dane, gniazdo wyglądało na zamknięte i zostałby wywołany wyjątek ClientAbortException. Z punktu widzenia klienta kolejny odczyt bajtów zakończyłby się niepowodzeniem, powodując przedwczesny wyjątek.

+0

Czy istnieje sposób radzenia sobie z tego rodzaju błędami? Mam taki sam problem z websockets, jak opisano tutaj: http://stackoverflow.com/questions/25662371/websocket-error-by-closing-a-page-via-browser-an-established-connection-was-ab – vdenotaris

1

Miałem podobny problem, a ja rozwiązałem go, nie używając BufferedReader, ale czytając jeden bajt na raz i umieszczając odczyt w try-catch dla EOFException. Mam nadzieję że to pomoże.

Powiązane problemy