29. november 2008 - 18:41Der er
8 kommentarer og 1 løsning
Indy TIdTCPServer og TIdTCPClient
Måske har dette ikke noget med Delphi at gøre men man har jo efterhånden lært ikke at udelukke noget. Jeg bruger Delphi 7 og Indy 10.2.3
Jeg har en server (TIdTCPServer) og ca. 30 klienter (TIdTCPClient) som forbinder til min server via internet.
Klienterne har ikke en konstant forbindelse til min server men opretter en forbindelse hver gang de vil noget og lukker derefter ned igen. Dette gør hver klient flere hundrede gange hver dag.
Det hele virker fint men der er lige nogle enkelte bestemte klienter som daglig får 1-2 fejl. Fejlene er altid: Connect timed out. eller Read timed out.
Jeg har lavet det således at klienterne forsøger 3 gange inden de melder fejl og jeg har sat ReadTimeout:=15000; og ConnectTimeout:=10000;
Jeg logger alt, men ved "Connect timed out" er der naturligvis ikke noget at logge. Jeg har netop send en ny klient version ud som sender mere detaljeret oplysninger tilbage til mig mht. hvor fejlen opstår. Jeg har lavet det således at der sendes en mail til mig hvis der opstår en fejl, grunden til denne mail er at åbenbart ingen brugere læser hvad der står på skærmen når der kommer en fejl besked frem.
I øjeblikket tror jeg dog mest på at det er hos klienterne det halter, altså dårlig udstyr eller forbindelse.
Jeg kan nævne en bestemt klient som fik masser af fejl hver dag men efter de så skiftede noget net udstyr (vist nok et netkort) så har de siden ikke haft en eneste fejl.
En anden mærkelig ting er at en bestemt klient mange gange i løbet af en dag skaber en exception i mit server program med fejl teksten "Connection reset by peer", men bortset fra det så virker alt som det skal hos denne klient.
Spørgsmålet er om det jeg har lavet med ReadTimeout:=15000;, ConnectTimeout:=10000; og 3 forsøg er nok til at tage højde for ustabile forbindelser.
Defekte netkort er en plage. Vi havde engang en mindre sygehuskunde der var ved at forlade kundeflokken ... indtil vi betalte en ekspert til at måle deres netværk igennem. Mener det var ét defekt netkort der var skyld i ventetider og datatab. Røvsvært at identificere.
Hvis du kan sætte fingeren på en bestemt klient er det nok værd at lege lidt med netkort (eller drivere).
Så kom der en fejl, dog fra en der ikke tidligere er kommet fejl fra. Fejlen er: Read timed out
Koden er, en del forkortet:
Klienten sender noget til serveren og venter så på svar: IdTCPClient.IOHandler.WriteLn(Post.CommaText); Svar.CommaText:=IdTCPClient.IOHandler.ReadLn; Stream:=TMemoryStream.Create; IdTCPClient.IOHandler.ReadStream(Stream,-1,false); //fejler her
Server modtager og svarer: Request.CommaText:=AContext.Connection.IOHandler.ReadLn; AContext.Connection.IOHandler.WriteLn(Result.CommaText); .. opretter stream og sender til klient AContext.Connection.IOHandler.Write(Stream, 0, true);
Fejlen opstår i linien "IdTCPClient.IOHandler.ReadStream(Stream,-1,false);" hos klienten.
Jeg pakker det hele ind i en try-except, nedsætter connect- og readtimeout og lader klienten forsøge 3 gange.
Synes godt om
Ny brugerNybegynder
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.