Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdTCPClient.ReadBuffer (https://www.delphipraxis.net/35681-idtcpclient-readbuffer.html)

swd 10. Dez 2004 16:41


IdTCPClient.ReadBuffer
 
hallo,
ich sitze an einem kleinen problem mit indy.
ich habe einen server und 18 clients, die clients erhalten daten vom server jedoch nicht alle zur selben zeit, d.h. das die clients zwischen durch auch auf antworten warten müssen. das führt bei mir dummerweise immer wieder dazu das die clients die warten müssen abschmieren. daher meine frage:

wenn ich IdAntiFreeze benutze kann ich dann einfach

IdTCPClient.ReadBuffer(transport_record,SizeOf(tra nsport_record));

benutzen und der Client wartet dann solange bis er etwas vom server erhält?

oder gibt es irgendeinen event den ich abfragen könnte um es dann so zumachen:

repeat until 'netzwerkevent';
IdTCPClient.ReadBuffer(transport_record,SizeOf(tra nsport_record));


vielen dank im vorraus

cya SWD

Dax 10. Dez 2004 16:55

Re: IdTCPClient.ReadBuffer
 
Du könntest die Read-Methode in eine Schleife setzen, den TimeOut auf 50ms stellen und alle EIdTimeOut-Exceptions (oder so ähnlich ;)) abfangen.

swd 10. Dez 2004 19:13

Re: IdTCPClient.ReadBuffer
 
danke, ich habe das mal mit ner schleife ausprobiert, habe dabei aber wohl ne endlosschleife produziert ;-), da wohl alles was der ReadBuffer zurückgibt als "Fehler" gewertet wird.
Delphi-Quellcode:
IdTCPClient.ReadTimeout := 50;
 fehler := false;
repeat
 try
  IdTCPClient.ReadBuffer(transport_record,SizeOf(transport_record));
 except
  fehler := true;
 end
until not fehler;
wie funktionier das mit der EIdTimeOut Exception? ich bin recht neu mit delphi dabei deswegen diese
dumme frage.

danke für jede hilfe

cya SWD

jfheins 10. Dez 2004 19:29

Re: IdTCPClient.ReadBuffer
 
Dein Verfahren ist grundsätzlich richtig, da man dafür eine Endlosschleife braucht.
Nun hat eine Endlosschleife eben den Nachteil, dass sie endlos dauert, und damit das Programm blockiert.
Die Lösung ist, diese endlosschleife in einen Thread auszulagern, der bei Erfolg das gelesene Verarbeiten lässt.

Dann würde man allerdings etwas wie folgt schreiben:
Delphi-Quellcode:
while not terminated do
  try
    ReadBuffer(...);
    verarbeite_gelesenes(...);
  except
  end;
end;
P.S. zum Thema Threads: Luckies Tutorial (pdf) erfordert allerdings imho gute Grundkenntnisse

swd 10. Dez 2004 20:35

Re: IdTCPClient.ReadBuffer
 
danke, aber ich habe halt nur marginale grundkentnisse... :-(

geht das denn nicht irgendwie einfach?
ich habe meinen client schon fertig, das einzige was halt nicht funktioniert ist das warten auf antworten. und ich hatte gehofft, dass ich das mit ner simplen schleife hinbekomme ohne das prog nochmal komplett neu zuschreiben..

cya SWD

swd 11. Dez 2004 00:05

Re: IdTCPClient.ReadBuffer
 
so ich habe das mal umgestellt und mit der (meiner meinung nach richtigen) exception

Delphi-Quellcode:
 
   IdTCPClient.ReadTimeout := 50;
   fehler := false;
    repeat
      try
       form1.IdTCPClient.ReadBuffer(transport_record,SizeOf(transport_record));
      except
       on EIdReadTimeOut do
        begin
         fehler := true;
        end;
      end
    until not fehler;
jedoch sagt der mir undeclared identifier für EIdReadTimeOut. warum? habe beispiele im netz gesehen bei denen das geklappt hat....

danke und cya SWD

Stefan Hueg 16. Dez 2004 01:40

Re: IdTCPClient.ReadBuffer
 
Zitat:

Zitat von swd
so ich habe das mal umgestellt und mit der (meiner meinung nach richtigen) exception

Delphi-Quellcode:
 
   IdTCPClient.ReadTimeout := 50;
   fehler := false;
    repeat
      try
       form1.IdTCPClient.ReadBuffer(transport_record,SizeOf(transport_record));
      except
       on EIdReadTimeOut do
        begin
         fehler := true;
        end;
      end
    until not fehler;
jedoch sagt der mir undeclared identifier für EIdReadTimeOut. warum? habe beispiele im netz gesehen bei denen das geklappt hat....

danke und cya SWD

Hast du folgendes in den Uses eingetragen: IdException

??

supermuckl 16. Dez 2004 04:46

Re: IdTCPClient.ReadBuffer
 
das problem liegt wohl woanderst.

es ist richtig, das der client solange wartet, bis er alles gelesen hat ( länge der zu lesenden bytes )

er wird solange blockierend darauf warten bis das letzte byte angekommen ist

ergo: du musst auch soviel senden !

ergo: dein record muss haargenau vom selben typ sein wie der auf dem server

du musst dir also mit readln oder readinteger irgend ein protocol erfinden, mit dem du alles drumherum handelst ("jetzt kommt der und der stream mit dem format") und dann mit readbuffer eine definierte länge liest

somit ist es dann egal ob es länger dauert, bis der server seinen buffer übertragen hat, der client wartet einfach solange ( solange man kein timeout z.b. in readln angegeben hat )

wenn du aber einen endlosbuffer hast (stream einer webcam oderso) dann musst du das ding natürlich in einen thread auslagern und in einer endlosschleife solange lesen lassen, bis die connection flöten gegangen ist, oder deine evtl selbstgemachte timeout zuschlägt und den thread terminiert usw

die thread - read methode ist besondert bei chats eingebaut, wo ein thread mit einer endlosschleife dauernd ReadLn macht und damit alles entgegennimmt und verarbeitet, was der server an den client schickt

swd 16. Dez 2004 10:12

Re: IdTCPClient.ReadBuffer
 
Danke, habe es jetzt einfach mit Java gebaut,
aber ich werde es trotzdem mal ausprobieren, ärgert mich das ich da ein halbfertiges programm habe ;-)

cya SWD


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz