mein Server Code ,eine Konsolenanwendung
Delphi-Quellcode:
procedure TIndyDataModule.IdTCPServerExecute(AContext: TIdContext);
var
CommandLine: String;
StrStream: TStream;
/// a) read command from client
CommandLine := AContext.Connection.IOHandler.ReadLn();
/// b) execute command on server, kann auch mal dauern die Berechnung
FAnalysisSteps(CommandLine);
/// c) send back a large stream
try
StrStream := TStringStream.Create(CommandLine);
AContext.Connection.IOHandler.LargeStream := True;
AContext.Connection.IOHandler.Write(StrStream, 0, True);
finally
StrStream.Free;
end;
und der Client Code , Windows FMX
Delphi-Quellcode:
logfile:
String;
AStream: TFileStream;
IdTCPClient1.IOHandler.WriteLn(MyCompleteCMDString);
// https://stackoverflow.com/questions/7989133/how-can-i-wait-for-a-string-from-a-server-with-idtcpclient
// https://forums.embarcadero.com/thread.jspa?threadID=111259
FReceivedAnswer := False;
TCPReadTimer.Enabled := True;
while (FReceivedAnswer = False)
do
begin
StatusbarLabel.Text := '
waiting for TCP server : ' + TimeToStr(Now);
Application.ProcessMessages;
end;
AStream := TFileStream.Create(logfile, fmCreate);
try
IdTCPClient1.IOHandler.LargeStream := True;
IdTCPClient1.IOHandler.ReadStream(AStream, -1, False);
finally
AStream.Free;
end;
procedure TMainForm.TCPReadTimerTimer(Sender: TObject);
begin
if IdTCPClient1.IOHandler.InputBufferIsEmpty
then
begin
IdTCPClient1.IOHandler.CheckForDataOnSource(10);
if IdTCPClient1.IOHandler.InputBufferIsEmpty
then
begin
ShowLogInfo('
TCP/IP Transfer failed , InputBufferIsEmpty ');
ScrollToLastLine(mmo_logger);
Exit;
end
else
begin
FReceivedAnswer := True;
TCPReadTimer.Enabled := False;
end;
end;
end;
Problem : das Schicken eines Strings und dann das Empfangen einer Antwort vom Server ist nicht stabil
Die Timer Schleifer wird auch dann manchmal verlassen wenn noch gar keine Daten empfangen wurde, der Server als noch nicht geliefert hat.
Wartezeit auf eine Serverantwort : kein Verzug ..... bis zu einige Stunden
Wer sieht das Problem ?