26. februar 2003 - 16:29Der er
15 kommentarer og 1 løsning
Telnet/Mud-server. Hvordan opdager man om klienterne er gået ned?
Jeg er ved at skrive en mud-server i ren Java og tingende går meget fint, bortset fra en lille irriterende detalje.
Så længe folk opfører sig ordentligt og logger pænt af og på er der ingen problemer, men hvis f.eks. folk (typisk windows-brugere) bare lukker deres program (typisk telnet) uden at logge af, kan min server ikke opfatte at deres socket er død. - Den sender blot lystigt videre (uden at klienten dog modtager noget selvfølgeligt!).
Hver bruger har et Connection objekt hvor serveren så vhert 3. sekund eller så løber igennem alle Connections og beder dem checke sig selv om de virker. Det de gør er:
- Ser om der har været exceptions i de respektive In- og Outputstreams.
- Ser om der kommer fejl hvis den sender en enkelt byte.
Intet af disse er tilfældet. Hvad skal man gøre for at opdage en ødelagt forbindelse??
det er ikke færdigt endnu... Egentlig lavede jeg først en mud-engine der blot manglede et kamp-system for at være færdig. Efter lidt tid (hvor jeg blev bedre til Java) fandt jeg ud af at min kode ikke ligefrem var smart, så jeg belsuttede at lave en ordentlig netværks engine som jeg så kunne bygge det hele ovenpå. Så svaret må være at målet er et mud, men at jeg først lige vil have en robust (underliggende) server.
Synes godt om
Slettet bruger
26. februar 2003 - 16:49#3
oki kan du sende mig enmail når det er færdigt på
tommybn75@hotmail.com
kun hvis du gider jeg mudder en del så det ville da være sjovt at prøve en ny en af slagsen
Synes godt om
Slettet bruger
26. februar 2003 - 16:59#4
Du kan ikke på nogen måde være sikker på hvornår din klient er gået ned. Det eneste du kan gøre er at lade serveren sende en forespørgsel til klienten, og hvis klienten ikke svarer tilbage indenfor et bestemt stykke tid, antage at den er gået ned.
Jeg skal forsøge at huske det. Jeg skal jo ogås bruge nogle beta-testere når det kommer så langt (men det kan tage tid)... - Men lad mig nu lige se om jeg overhovedet kan finde en ordentlig løsning på mit problem...
Det store problem er at jeg ikke har nogen bestemt protokol defineret, så jeg kan ikke forvente at klienter sender noget tilbage (de ved jo ikke hvad en forespørgsel er når der ikke er nogen protokol). Hvis jeg nu antog at alle loggede på med telnet tror jeg at det kan lade sig gøre men jeg ved ikke hvordan.
Det lyder som om du foreslår en slags time-out strategi? Det skulle heller ikke være så svært at implementere... - Bare smide folk af serveren hvis de ikke har gjort noget i fem minutter eller lignende. Jeg ville bare foretrække at smide folk af med det samme hvis der var noget i vejen. Ellers ville folk ikke kunne logge på (efter klienten går ned) igen før serveren time-outer dem.
Fordi serveren ikke ved hvad det er for nogen klienter der er logget på. Jeg vil helst antage at det er telnet. Men hvordan beder man en telnetklient om at sende I-am-alive messages (udover at bede brugeren indtaste noget hvert sekund :-( )??
Jeg tror at jeg har fundet hvad du mener i Java API'en i java.nio.channels.SocketChannel. Den så lovende ud indtil jeg opdagede at den var abstract, så er man jo lige vidt...
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.