|
| socket timeout Fra : holst |
Dato : 07-04-04 13:04 |
|
Hej alle..
Sidder og koder noget Client /Server socket programmering, som skal være
stabilt, og derfor skal kunne holde til at man f.eks. rykker netstikket ud
mellem server og client i op til XX sekunder. Mit problem er at river jeg
netstikket ud i mere end ca. 5 sekunder, så kommer der en IOException på den
computer hvor jeg rykker stikket ud fra, men ikke på den anden.
Er der en måde hvorpå man kan sætte timeout'en op og dermed undgår den
exception (jeg går ud fra at det er en TCP timeout der forudsager
problemer)? Eller hvordan sikrer jeg mig at begge computere i det mindste
finder ud af at de har mistet forbindelsen, og ikke bare den, hvor jeg
rykker stikket ud?
Håber nogen kan hjælpe.
mvh
Allan
| |
Anders K. Olsen (07-04-2004)
| Kommentar Fra : Anders K. Olsen |
Dato : 07-04-04 16:16 |
|
"holst" <holstFJERNES@control.auc.dk> wrote in message
news:c50r04$9ds$1@sunsite.dk...
> Hej alle..
>
> Sidder og koder noget Client /Server socket programmering, som skal være
> stabilt, og derfor skal kunne holde til at man f.eks. rykker netstikket ud
> mellem server og client i op til XX sekunder. Mit problem er at river jeg
> netstikket ud i mere end ca. 5 sekunder, så kommer der en IOException på
den
> computer hvor jeg rykker stikket ud fra, men ikke på den anden.
>
> Er der en måde hvorpå man kan sætte timeout'en op og dermed undgår den
> exception (jeg går ud fra at det er en TCP timeout der forudsager
> problemer)? Eller hvordan sikrer jeg mig at begge computere i det mindste
> finder ud af at de har mistet forbindelsen, og ikke bare den, hvor jeg
> rykker stikket ud?
>
> Håber nogen kan hjælpe.
Hej Allan
Vi har haft nogle lignende problemer i det projekt jeg arbejder på. Vi
bruger bl.a. TCP sockets til kommunikaiton over envejs kanaler. Dvs. vi har
en fast afsender og fast modtager. Vores problem har været, at modtageren
skulle opleve når afsenderen forsvandt. Modtageren står bare og lytter på en
socket, men den sender ikke selv data afsted. Derfor får den ingen besked
hvis forbindelsen ryger. Vi har kikket på SO_KEEPALIVE (se Javadoc for
java.net.SocketImpl for lidt mere info om Socket options), men 2 timers
keepalive er for meget for os. Vi har derfor været nødt til at implementere
vores egen keep alive mekanisme.
Du vil nok ikke kunne undgå en Exception, hvis du trækker stikke ud. Der
optræder jo en fejlsituation, så det er op til dig at håndtere den passende
(evt. forsøge at genetablere forbindelsen indtil det lykkedes igen). Det
kunne dog være interessant at se helt præcist hvad det er da kaster
exceptionen? Er det et read(), write(), accept() eller andet kald på
socketen? Jeg kunne forstille mig, at TCP/IP stakken på afsender maskinen
bliver opmærksom på, at den har mistet forbindelsen til omverdenen, og
derfor ved den at den ikke kan aflevere pakker til modtagere på andre
maskiner. I denne situation vil det vel være fornuftigt at give op, og lade
brugeren håndtere problemer. Du kan så vælge at håndtere det ved at vente
lidt, og så prøve igen, men det er vel fornuftigt nok at lade det være op
til dig at træffe dette valg.
Vi har i vores projekt oplevet, at afsenderen godt kan sende pakker afsted
på en socket selv om der ingen forbindelse er til modtageren
(netværksstikket trukket ud på modtageren, ikke afsenderen). På et tidspunkt
fyldes en operativsystem buffer op, og så blokkere write() kaldet. Først
efter endnu noget tid begynder der at komme exceptions. Men det kan godt
tage minutter. Dette har vi i hvert fald oplevet under Sun Solaris.
Det er også generel min opfattelse, at når man begynder at grave sig dybere
ned i Sockets, så kan Javas opførsel være forskellig fra platform til
platform (vi arbejder med Windows 2000, Sun Solaris og Linux - tidligere
også LynxOS).
Venlig hilsen
Anders
| |
stig (07-04-2004)
| Kommentar Fra : stig |
Dato : 07-04-04 17:17 |
|
Jeg bruger en class posted på javaworld, TimedSocket
http://www.javaworld.com/javaworld/jw-09-1999/jw-09-timeout.html
Stig
"holst" <holstFJERNES@control.auc.dk> wrote in message
news:c50r04$9ds$1@sunsite.dk...
> Hej alle..
>
> Sidder og koder noget Client /Server socket programmering, som skal være
> stabilt, og derfor skal kunne holde til at man f.eks. rykker netstikket ud
> mellem server og client i op til XX sekunder. Mit problem er at river jeg
> netstikket ud i mere end ca. 5 sekunder, så kommer der en IOException på
den
> computer hvor jeg rykker stikket ud fra, men ikke på den anden.
>
> Er der en måde hvorpå man kan sætte timeout'en op og dermed undgår den
> exception (jeg går ud fra at det er en TCP timeout der forudsager
> problemer)? Eller hvordan sikrer jeg mig at begge computere i det mindste
> finder ud af at de har mistet forbindelsen, og ikke bare den, hvor jeg
> rykker stikket ud?
>
> Håber nogen kan hjælpe.
>
> mvh
> Allan
>
>
| |
stig (07-04-2004)
| Kommentar Fra : stig |
Dato : 07-04-04 17:39 |
|
En ting mere.
Serveren kan aldrig vide hvornår forbindelsen er mistet, med mindre det
indgår i din 'protokol', altså at klienten sender - jeg er her stadig -
meddelelser.
Stig
"stig" <stigth@stofanet.dk> wrote in message
news:4074288a$0$23147$ba624c82@nntp05.dk.telia.net...
> Jeg bruger en class posted på javaworld, TimedSocket
>
> http://www.javaworld.com/javaworld/jw-09-1999/jw-09-timeout.html
>
> Stig
>
> "holst" <holstFJERNES@control.auc.dk> wrote in message
> news:c50r04$9ds$1@sunsite.dk...
> > Hej alle..
> >
> > Sidder og koder noget Client /Server socket programmering, som skal være
> > stabilt, og derfor skal kunne holde til at man f.eks. rykker netstikket
ud
> > mellem server og client i op til XX sekunder. Mit problem er at river
jeg
> > netstikket ud i mere end ca. 5 sekunder, så kommer der en IOException på
> den
> > computer hvor jeg rykker stikket ud fra, men ikke på den anden.
> >
> > Er der en måde hvorpå man kan sætte timeout'en op og dermed undgår den
> > exception (jeg går ud fra at det er en TCP timeout der forudsager
> > problemer)? Eller hvordan sikrer jeg mig at begge computere i det
mindste
> > finder ud af at de har mistet forbindelsen, og ikke bare den, hvor jeg
> > rykker stikket ud?
> >
> > Håber nogen kan hjælpe.
> >
> > mvh
> > Allan
> >
> >
>
>
| |
Ukendt (08-04-2004)
| Kommentar Fra : Ukendt |
Dato : 08-04-04 13:43 |
|
holst wrote:
>Hej alle..
>
>Sidder og koder noget Client /Server socket programmering, som skal være
>stabilt, og derfor skal kunne holde til at man f.eks. rykker netstikket ud
>mellem server og client i op til XX sekunder. Mit problem er at river jeg
>netstikket ud i mere end ca. 5 sekunder, så kommer der en IOException på den
>computer hvor jeg rykker stikket ud fra, men ikke på den anden.
>
>Er der en måde hvorpå man kan sætte timeout'en op og dermed undgår den
>exception (jeg går ud fra at det er en TCP timeout der forudsager
>problemer)? Eller hvordan sikrer jeg mig at begge computere i det mindste
>finder ud af at de har mistet forbindelsen, og ikke bare den, hvor jeg
>rykker stikket ud?
>
>Håber nogen kan hjælpe.
>
>mvh
>Allan
>
>
>
>
Jeg mener at det er forket at begynde at rode med timeouts og ligende. I
stedet, sørg for at din klient kan genoptag forbindelsen og vigtigst af
alt - forsætte hvor den slap. Så har du et stabilt miljø og rigtig glade
kunde :D
Hvis du har state på server siden, så brug en session id i din protokol,
så kan du applikation godt tåle at forbindelsen ryger. ganske som HTTP
protokolen, den kan både holde forbindelsen (HTTP 1.1 - default) eller
oprette en forbindelse pr request (HTTP 1.0 - default).
--
Regards, Frank
- En ægte Karl Koder -
| |
holst (09-04-2004)
| Kommentar Fra : holst |
Dato : 09-04-04 10:58 |
|
"frank.nielsen AT rocketmail DOT com" <"frank.nielsen AT rocketmail DOT
com"> wrote in message news:40754973$0$234$edfadb0f@dread11.news.tele.dk...
> Jeg mener at det er forket at begynde at rode med timeouts og ligende. I
> stedet, sørg for at din klient kan genoptag forbindelsen og vigtigst af
> alt - forsætte hvor den slap. Så har du et stabilt miljø og rigtig glade
> kunde :D
Ja, det er osse planen, at klienten skal genoptage forbindelsen, men
problemet er at klienten adlrig opdager at forbindelsen er væk. Den "sender"
bare videre uden at opdage noget. En af grundene til at klienten ikke
opdager noget, at jeg ikke bruge acknowledge på det data klienten sender,
men det er en del af kravspec'en.
Derfor: Er der nogen som ved, hvordan jeg får klienten til at opdage at
forbindelsen er tabt? Synes jeg har prøvet med alt der er muligt på socket
klassen, og osse printwriter klassen, som jeg bruger til at sende med - for
det er vel når jeg sender at jeg skal opdage at der intet netværk er.... :(
mvh
Allan
| |
|
|