AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi IdTCPClient.ReadBuffer
Thema durchsuchen
Ansicht
Themen-Optionen

IdTCPClient.ReadBuffer

Ein Thema von swd · begonnen am 10. Dez 2004 · letzter Beitrag vom 16. Dez 2004
Antwort Antwort
swd

Registriert seit: 10. Dez 2004
5 Beiträge
 
#1

IdTCPClient.ReadBuffer

  Alt 10. Dez 2004, 16:41
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: IdTCPClient.ReadBuffer

  Alt 10. Dez 2004, 16:55
Du könntest die Read-Methode in eine Schleife setzen, den TimeOut auf 50ms stellen und alle EIdTimeOut-Exceptions (oder so ähnlich ) abfangen.
  Mit Zitat antworten Zitat
swd

Registriert seit: 10. Dez 2004
5 Beiträge
 
#3

Re: IdTCPClient.ReadBuffer

  Alt 10. Dez 2004, 19:13
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: IdTCPClient.ReadBuffer

  Alt 10. Dez 2004, 19:29
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
  Mit Zitat antworten Zitat
swd

Registriert seit: 10. Dez 2004
5 Beiträge
 
#5

Re: IdTCPClient.ReadBuffer

  Alt 10. Dez 2004, 20:35
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
  Mit Zitat antworten Zitat
swd

Registriert seit: 10. Dez 2004
5 Beiträge
 
#6

Re: IdTCPClient.ReadBuffer

  Alt 11. Dez 2004, 00:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Stefan Hueg
Stefan Hueg

Registriert seit: 13. Jun 2004
Ort: Gießen
187 Beiträge
 
Delphi 2006 Professional
 
#7

Re: IdTCPClient.ReadBuffer

  Alt 16. Dez 2004, 01:40
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

??
Stefan Hueg
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#8

Re: IdTCPClient.ReadBuffer

  Alt 16. Dez 2004, 04:46
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
swd

Registriert seit: 10. Dez 2004
5 Beiträge
 
#9

Re: IdTCPClient.ReadBuffer

  Alt 16. Dez 2004, 10:12
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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