Avatar billede kamstrup Nybegynder
26. februar 2003 - 16:29 Der 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??

//kamstrup
Avatar billede Slettet bruger
26. februar 2003 - 16:33 #1
lige et lille tillægs spørgsmål er det et mudspil du har lavet og i så fald hvor
Avatar billede kamstrup Nybegynder
26. februar 2003 - 16:46 #2
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.
Avatar billede 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
Avatar billede 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.
Avatar billede kamstrup Nybegynder
26. februar 2003 - 17:00 #5
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...
Avatar billede kamstrup Nybegynder
26. februar 2003 - 17:07 #6
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.

//kamstrup
Avatar billede arne_v Ekspert
26. februar 2003 - 17:08 #7
Hvorfor ikke require clients at sende I-am-alive messages
med at bestmt interval ?
Avatar billede kamstrup Nybegynder
26. februar 2003 - 17:14 #8
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 :-( )??
Avatar billede arne_v Ekspert
26. februar 2003 - 17:28 #9
Du mener at det er:
  telnet app på client <---> special app på server
?

Nu har jeg sikkert afsløret min grænseløse uvidenhed om hvad
en MUD server er !

:-)
Avatar billede disky Nybegynder
26. februar 2003 - 18:48 #10
I JDK1.4 er der nogle klasser hvor timeout er med i, netop til at fange sådanne fejl, jeg mener de er i java.nio.*

På dens forbindelser kan du direkte spørge om de er connectet.

arne:
Mud er Multi User Dungeon, et text baseret rollespil.
Avatar billede kamstrup Nybegynder
27. februar 2003 - 11:34 #11
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...
Avatar billede disky Nybegynder
27. februar 2003 - 11:50 #12
Du giver hurtigt op.

Kig her:
http://search.java.sun.com/search/java/index.jsp?qp=&nh=10&qt=java.nio.channels.SocketChannel&col=java&col=javaforums&col=wireless&x=30&y=9

En enkelt søgning på www.javasoft.com gav 11 tråde om lige netop den class, hvor ihvertefalde de 2 første indeholder kode eksempler
Avatar billede disky Nybegynder
27. februar 2003 - 11:55 #13
speciel
http://forum.java.sun.com/thread.jsp?forum=4&thread=223743

indeholder et komplet eksempel, som du evt. kan bruge direkte.
Avatar billede kamstrup Nybegynder
27. februar 2003 - 13:18 #14
Jeg tror at det er lykkedes mig at fiske en løsning ud af dine links. Tak.

//kamstrup
Avatar billede disky Nybegynder
27. februar 2003 - 13:41 #15
Selv tak, sig lige til når vi skal spille på dit MUD :)
Avatar billede kamstrup Nybegynder
27. februar 2003 - 16:05 #16
klart... ;P
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