Avatar billede digitalsoul Nybegynder
16. januar 2005 - 22:42 Der er 8 kommentarer og
1 løsning

Socket timeout problemer

I et forsøg på at lære lidt om netværks programmering, har jeg lavet et mindre besked system. Det har kontaktliste, forskellige statuser (online, invisible, offline) og nogle andre ting. Det er opbygget så det er objekter der sendes og ikke bare Strings. For at gøre det lidt mere udfordrende. Det er selvfølgelig opbygget som en flertrådet server så der kan være flere brugere online på samme tid.

Jeg har så lavet så når klienten sætter sin tilstand til offline, så sender den et state objekt til serveren som så lukker forbindelsen ned og fjerner den worker som klienten snakker med. Det virker fint på lan hvor chancen for at forbindelsen bliver afbrudt ikke er ret stor. Mit spørgsmål er så, hvordan skal man tage højde for de uventede ting?

Eks. forbindelsen på en klient forsvinder, så får den aldrig afsendt nedluknings objektet til klienten.

Hvad vil der ske i den situation? Vil man få en exception? og hvis det nu var tilfældet, skulle man så catche den og sige at når det sker så lukker man workeren ned?

Jeg havde tænkt på IRC principet, hvor serveren hele tiden spørger klienten om den er der, ping? hvor klienten så svarer ping! Hvis tingene ikke kommer frem inden for et given tidsrum, så ved serveren at personen er timeoutet. Og klienten ved at den er blevet disconnected. Kunne man implementere sådan en løsning?

Server: alive? klient: yes!

Serveren sender en string til klienten, og hvis den ikke får noget reply inden for et given tidsrum. Så ved den at der er gået noget galt og den skal lukke workeren ned og sætte det ID som workeren svarer til offline. Ligeledes på klientens side, hvis den ikke får noget alive? request fra serveren, så ved den at der ikke er forbindelse til serveren, og så sætter den klienten værende som offline. Når man så går offline igen, så vil den genoprette forbindelsen og en ny worker vil blive oprettet.

Er det en totalt tosset ide?
Avatar billede digitalsoul Nybegynder
16. januar 2005 - 22:43 #1
Burde måske lige nævne at det princip jeg bruger til flertrådet server er som følgende:

Jeg har en clientmanager som tager sig af accept kaldet, og så instansier en clientworker som tager socketen med som parametre. Så det er workeren der kommer til at agere server overfor klienten.
Avatar billede arne_v Ekspert
16. januar 2005 - 22:59 #2
Du har selv nævnt de 2 klassiske løsninger:

- bare vente, få en exception, catche den og lukke ned

- definere en keep alive i protokollen, lukke ned når timeout er overskredet
Avatar billede digitalsoul Nybegynder
17. januar 2005 - 00:00 #3
Hvilken er så den bedste?

Med exception måden, finder jeg vel reelt set først ud af der er et problem når jeg prøver at sende noget over socketen?

Med keep alive kan jeg vel sikre mig at både serveren og klienten finder ud af der er gået noget galt. Ville den effekt ikke være sværere at opnå med exceptions?
Avatar billede arne_v Ekspert
17. januar 2005 - 00:04 #4
Keep alive metoden opdager den brudte forbindelse langt hurtigere.

Men genererer også en del ekstra trafik.

Hvad der er bedst må være din vurdering.
Avatar billede arne_v Ekspert
17. januar 2005 - 00:06 #5
Du kan vel enten bruge exception i begge ender eller exception i den ene ende og keep
alive i den anden ende eller keep alive i begge ender.

Ofte er man ligeglad med client.
Avatar billede digitalsoul Nybegynder
17. januar 2005 - 00:12 #6
Og som en super sikring, exceptions og keep alive i begge ender? :)

Du må gerne smide et svar..
Avatar billede arne_v Ekspert
17. januar 2005 - 00:14 #7
svar
Avatar billede arne_v Ekspert
17. januar 2005 - 00:14 #8
Det er iøvrigt langt værre hvis du skifter fra TCP til UDP !

:-)
Avatar billede digitalsoul Nybegynder
17. januar 2005 - 00:17 #9
UDP - /me shivers
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