Hier die stromsparende Variante, nach
http://stackoverflow.com/a/544473/80901 (unter Berücksichtigung der Anmerkungen von Remy Lebeau):
Delphi-Quellcode:
procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var
RxBuf: TIdBytes;
begin
RxBuf := nil;
with AContext.Connection.IOHandler do
begin
if InputBufferIsEmpty then
begin
CheckForDataOnSource(10);
if InputBufferIsEmpty then
begin
Exit;
end;
InputBuffer.ExtractToBytes(RxBuf);
// process RxBuf as needed...
end;
end;
end;
p.s. in diesem Beispiel sendet der Client einen Request, der dann vom Server verarbeitet wird.
Es kann aber im OnExecute Handler als erstes eine Nachricht an den Client gesendet werden. Zum Beispiel, wenn der Server eine interne Queue von Daten hat, die er nach und nach an den Client senden soll.
In diesem Fall würde der OnExecute Handler anders aufgebaut:
* hole ein Element aus der Queue
* falls kein Element vorhanden war, Exit
* sonst: schreibe die Daten an den Client - AContext.Connection.IOHandler.WriteLn(Daten);
* fertig (es sei denn, eine "synchrone" Quittung des Clients wird benötigt, dann weiter mit CheckForDataOnSource(TimeOut);