Avatar billede mollevp Nybegynder
29. september 2005 - 21:54 Der 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..

På forhånd tak, mvh morten..
Avatar billede mikkelbm Nybegynder
29. september 2005 - 21:56 #1
Hvis du kalder close på din socket, mener jeg at accept metoden smider en exception.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 21:56 #2
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.."
Avatar billede arne_v Ekspert
29. september 2005 - 21:57 #3
ofte lader man "stop programmet" connecte til server og sende en "stop kommando"
som får serveren til at hoppe ud af loopet
Avatar billede mollevp Nybegynder
29. september 2005 - 22:43 #4
>>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 :)
Avatar billede arne_v Ekspert
29. september 2005 - 22:47 #5
ok
Avatar billede mikkelbm Nybegynder
29. september 2005 - 22:47 #6
Du kan da ikke undgå at afbryde den accept, hvis du vil slukke for serveren!?
Avatar billede mikkelbm Nybegynder
29. september 2005 - 22:51 #7
>> mollevp

Hvordan vil du lukke serveren ned, hvis ikke du vil kalde en close på din serversocket?
Avatar billede mollevp Nybegynder
29. september 2005 - 22:52 #8
>> Du kan da ikke undgå at afbryde den accept, hvis du vil slukke for serveren!?

Jeg vil hellere ikke undgå at afbryde accept'en - jeg vil bare sikre mig at jeg
gør det korrekt/"pænt".
Avatar billede mikkelbm Nybegynder
29. september 2005 - 22:55 #9
Nu går jeg normalt ikke så meget op i det, men:

"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?
Avatar billede arne_v Ekspert
29. september 2005 - 22:57 #10
jeg tror at pointen lidt er: hvad skal kalde den close hvornår ?
Avatar billede mikkelbm Nybegynder
29. september 2005 - 22:57 #11
Okay. Så misforstod jeg bare spørgsmålet.
Avatar billede arne_v Ekspert
29. september 2005 - 23:02 #12
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å
Avatar billede mollevp Nybegynder
29. september 2005 - 23:06 #13
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.

Eller?
Avatar billede arne_v Ekspert
29. september 2005 - 23:09 #14
det afhænger vel mest om hvorvidt clients kan håndtere exceptions

men der skal stadig være noget som laver den close

en timer er ikke speciel køn

og hvis man sender en "stop kommando" så virker en clos elidt brutal sammenlignet
med en break
Avatar billede mollevp Nybegynder
29. september 2005 - 23:10 #15
>>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.
Avatar billede mollevp Nybegynder
29. september 2005 - 23:11 #16
med timer mente jeg at sætten time-out på accept-kaldet således at jeg kunne komme ud og tjekke flaget i while løkken..
Avatar billede arne_v Ekspert
29. september 2005 - 23:13 #17
så er jeg lidt forvirret

hvorfor skulle ingen connections indenfor X sekunder betyder at man kan lukke ned ?
Avatar billede mollevp Nybegynder
29. september 2005 - 23:14 #18
>> men der skal stadig være noget som laver den close

Ja det skal der vel egentligt, det må ryge ned i en finally ..
Avatar billede mollevp Nybegynder
29. september 2005 - 23:17 #19
>> 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.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 23:21 #20
På den måde får du så ikke afbrudt forbindelsen. En ny klient kan jo så nå at logge på i mellemtiden.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 23:22 #21
På den måde får du så ikke afbrudt forbindelsen med det samme.

Skulle der stå :)
Avatar billede mollevp Nybegynder
29. september 2005 - 23:32 #22
Jeg er lige begyndt på socket programmering i Java - hvis det jeg siger er ukorrekt må I endelig rette på mig :)

>> På den måde får du så ikke afbrudt forbindelsen med det samme.
Jeg troede kun klienterne kunne logge på mens jeg stod i accept() kaldet?
Avatar billede mikkelbm Nybegynder
29. september 2005 - 23:34 #23
Det kan de også kun. Men den vil jo stå der og "hænge" indtil den timer ud.
Avatar billede mikkelbm Nybegynder
29. september 2005 - 23:34 #24
Hvis du vil bruge din timeout løsning.
Avatar billede mollevp Nybegynder
29. september 2005 - 23:41 #25
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
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