Avatar billede mtilsted Nybegynder
11. februar 2001 - 18:55 Der er 13 kommentarer

ServletOutputStream write trower ikke IOexception

Jeg har en servlet class som extender
HttpServlet. Jeg bruger saa
getOutputStream til at faa et ServletOutputStream object og det virker ogsaa godt nok. Naar jeg bruger write paa min ServletOutputStream bliver data sendt til clienten men jeg har et problem.
Hvis clienten cancler download(Det er binary data) saa laver write ikke nogle IOException som det skal. I stedet virker det som om at write bare ignorere alle data og retunere med det samme. -(
Hvorfor det!!!
Avatar billede monz Nybegynder
13. februar 2001 - 21:41 #1
Hej ..

Hvilken servlet engine bruger du ?

Typisk vil du vel ikke have en exception hver gang en bruger trykker stop eller hopper videre til en anden side før hele siden er hentet. Det kunne fylde en log ret hurtigt.

Mvh
Anders
Avatar billede mtilsted Nybegynder
13. februar 2001 - 22:13 #2
Log?? Jeg havde da tænkt mig selv at catch den exception der kommer. Problemet nu er at serveren tror at clienter stadig er modtager data, saa den bliver med med at lave og sende data -(

Avatar billede elster Nybegynder
14. februar 2001 - 21:20 #3
Hej,

Jeg havde selv et lignende problem.
Hvis du flusher dit output efter hvert tegn du har sendt til klienten, bliver der genereret en
IOException hvis brugeren cancler eller lukker sin browser.

F.eks.:
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException
{
try {
  ServletOutputStream out = res.getOutputStream();
  res.setContentType(\"text/html\");
  // Skriv alle chars ud (0 til 65535)
  for (int i = 0; i < 65535; i++) {
    out.print(i);
    out.flush();
  }
}
catch (IOException ex) {
    // Fejl: Connection reset by peer: socket write error
}
}

Hvis brugeren cancler eller lukker browseren mens servletten udskriver ovenstående, throwes der en IOException
Avatar billede mtilsted Nybegynder
14. februar 2001 - 21:26 #4
Det vil jeg da lige tjekke og saa vende til bage med, men da programmet skal sende filer paa flere hundrede MB er det nok ikke en permenent løsning pga cpu overhead ved alle de flush kald.
Avatar billede mtilsted Nybegynder
17. marts 2001 - 15:10 #5
At skrive 1 byte af gangen virker i ca 80% af tilfældende, men det gør ogsaa at ydelsen af vores server faldet til 1/10 af hvad den var før, saa jeg har i stedet valgt at omskrive den del af programmet til php.
Avatar billede elster Nybegynder
18. marts 2001 - 15:38 #6
OK, det er der jo ikke noget at gøre ved.
Avatar billede lbhansen Nybegynder
28. maj 2001 - 22:11 #7
Du kunne jo alternativt bare lade være med at flushe hele tiden. Det er jo nok at gøre det for hver 10K data eller lign.
Avatar billede mtilsted Nybegynder
29. maj 2001 - 12:54 #8
Men saa faar man ikke den IO exception.
Avatar billede lbhansen Nybegynder
29. maj 2001 - 13:10 #9
jo, den kommer bare med en forsinkelse
Avatar billede mtilsted Nybegynder
29. maj 2001 - 15:20 #10
Nej, den kommer ikke. jeg HAR tested det.
Avatar billede elster Nybegynder
30. maj 2001 - 11:58 #11
Det lyder da underligt? En IOException burde opstå hver gang du prøver at sende information til klienten og klienten har lukket sin socket (lige meget om det er 1 eller 100 byte).
Avatar billede mtilsted Nybegynder
30. maj 2001 - 14:25 #12
Ja, og bugger er at det gør der ikke. Det er en kendt bug i apache/jakarta tomcat.

Avatar billede soelvpil Nybegynder
18. oktober 2002 - 08:26 #13
Hvad med at få lukket det spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester