Avatar billede webster Nybegynder
26. oktober 2001 - 13:49 Der er 6 kommentarer og
1 løsning

Socket problem

hejsa

nu har jeg efterhånden stillet det her spørgsmål et par gange, uden at få noget brugbart ud af det.

Mit problem er at min server ikke er i stand til at detekte hvis klienten lukker forbindelsen. Her er koden:

    try{
        while (true){
        String str = in.readLine();
        if (str != null){
            handleClientMessage(str);
        }
        }

    }catch (SocketException es){
        Log.event(\"SocketException caught in ConnectionHandler\");
    }catch (Exception e){
        Log.event(\"Exception caught in ConnectionHandler\");
        e.printStackTrace();
    }finally{
        releaseConnection();
    }

Jeg er klar til at smide alle mine point i hovedet på den person der kan hjælpe hvis det er hvad der skal til :-) jeg er ligeglad med om der læses fra streamen på en anden måde fx bytevis. Bare den kan opdage at klienten disconnecter.

Input stream er forresten en BufferedReader.
Avatar billede disky Nybegynder
26. oktober 2001 - 13:51 #1
prøv at test for om du får en IOException. Din inputStream skulle smide sådanne en hvis der går noget galt.
Avatar billede disky Nybegynder
26. oktober 2001 - 13:57 #2
forresten er det ikke en pæn måde dit read loop kører på, med en uendelig løkke.

Avatar billede disky Nybegynder
26. oktober 2001 - 14:00 #3
så vidt jeg kan se på www.javasoft.com \'s forum

kan du ikke gøre det, da IO er synkront.

Altså hvis clienten forsvinder hænger forbindelsen.

Men du kan så overvåge den med en tråd, og hvis der ikke sker traffik inden for f.eks 1 min. så tvinger du IO til at lukke forbindelsen.

Jdk1.4 kommer til at understøtte asynkron IO.
Avatar billede disky Nybegynder
26. oktober 2001 - 14:01 #4
Avatar billede webster Nybegynder
26. oktober 2001 - 14:26 #5
hehe mange tak disky, jeg tjekker det lige igennem. Tjek forresten http://www.datamekanikeren.dk/andet/jannick/belastning.jpg for at se hvorfor jeg ikke er så vild med serveren som den er nu :-)
Avatar billede disky Nybegynder
26. oktober 2001 - 14:33 #6
er du ikke bare lidt følsom ?? :-)

prøv evt:

String str;
try
{
  while ( (str=in.readLine())!=null)
  {
      handleClientMessage(str);
  }
}

Det gør nok ikke den store forskel, men det er \'pænere\' :)

Men det er lidt mystisk at CPU belastning stiger som en gal, når forbindelsen ryger
       
Avatar billede webster Nybegynder
28. oktober 2001 - 13:57 #7
disky du er en gud, det virker nu med din while check. Den finder fint ud af om forbindelser lukker nu. Angående den store cpu belastning så sad jeg lige og legede med at læse bytevis fra in streamen. Når forbindelsen lukkes læser den en værdi der angiver som -1. Hvis man forsøger at lave en sammenligning ala:

if (valueFromStream == -1)

så giver det ikke et sandt resultat, så jeg vil tro at det der læses er en eller anden form for \"ikke-eksisterende-værdi\". Men anyways det se ud til at pga. min while(true) så står den og kører in.readLine() flere tusinde gange i sekundet og æder cpu på det.

takker for hjælpen
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