29. september 2005 - 21:54Der er
24 kommentarer og 1 løsning
Den korrekte måde at lukke en blocking server socket
Hej, Jeg er kommet lidt i tvivl om hvordan jeg håndtere start/stop af en server korrekt. Jeg har lavet noget ala.
ServerSocket ssocket = new ServerSocket(port);
while(running == true){
almsocket = ssocket.accept();
}
Nu er accept kaldet jo blocking - så hvordan stopper jeg min server igen. Jeg har overvejet at sætte en time-out - er det den bedste måde? Eller er den en anden måde?
Jeg vil ikke bruge NIO, det gør jeg måske senere - men som det er lige nu prøver vi med en alm serversocket..
Den skal jo helst opføre sig "pænt" så jeg ikke riskere at en evt. klient der connecter bliver fanget i en server nedlukning..
>>Og hvad mener du helt præcist med: >> >>"Den skal jo helst opføre sig "pænt" så jeg ikke riskere at en evt. klient der >>connecter bliver fanget i en server nedlukning.."
Jeg vil bare ikke komme til at lave noget, der kan give udefinered resultater - da jeg altid har lært at man skal passe på med at afbryde blocking IO :)
>>ofte lader man "stop programmet" connecte til server og sende en "stop kommando" >>som får serveren til at hoppe ud af loopet
Det var en god løsning - takker arne, smid et svar :)
"Nu er accept kaldet jo blocking - så hvordan stopper jeg min server igen. Jeg har overvejet at sætte en time-out - er det den bedste måde? Eller er den en anden måde?"
Jeg svarer: Kald close på din socket, og den vil afbryde den blokerende effekt. Er det ikke svar på dit spørgsmål?
breake ud af den uendelige while løkke som accepter connections ved stop kommando og så joine på alle tråde som er igang med at processe ældre requests lyder som en OK måde at afslutte på
Måske er det mig der er gal på den, jeg kunne kalde close(), og det ville kaste en eller anden exception i den tråd der er blokeret af accept kaldet - enig. Men kan det ikke give anledning til udefinerede resultater? Jeg mener at det er en pænere løsning at connecte til serveren selv og derved komme ud af loopet uden at kaste med exceptions.
>>breake ud af den uendelige while løkke som accepter connections ved stop kommando >>og så joine på alle tråde som er igang med at processe ældre requests lyder >>som en OK måde at afslutte på
Det er i mine øjne bedre end at kalde close() på socket'en.
>> hvorfor skulle ingen connections indenfor X sekunder betyder at man kan lukke ned ?
Ideen med timeout'en var også bare at jeg kunne komme ud af while loopet så der ikke var flere klienter der connectede.. Jeg kan jo som du foreslår stadig joine tråde osv, jeg skal bare lige ud af det while loop.
ahh, jo det har du helt ret i.. Det ville være en dum løsning, det er rigtigt - da jeg skrev spørgsmålet var det bare den eneste jeg lige kunne se. Jeg sætter pris på din feedback - altid rart at lære noget nyt :) mvh morten
Synes godt om
Ny brugerNybegynder
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.