Hallo liebe Delphi-Gemeinde,
viel habe ich hier im Forum schon gelernt aus den älteren Posts, diesmal bin ich aber auf direkte Hilfe angewiesen.
Ich möchte eine Server/Client-Verbindung, bei dem der Server, wenn er das möchte, unaufgefordert einen String versendet. Der Client müsste sich ja dafür zunächst connecten und dann in eine Art "Lausch"-Modus übergehen. Wie realisiere ich das?
Zur Zeit ist es bei mir so, dass ich laut Timer ein Readln ausführe beim Client und der Server ja dann das OnExecute-Ereignis auführt. Das ganze funktioniert auch, nur möchte ich eher, dass der Server entscheidet, wann er was schicken möchte und der Client immer connected ist und auf Strings wartet. Natürlich möchte ich aber auch einen Timeout, falls der Server über eine gewisse Zeit gar nichts mehr sendet. Hier mein bisheriger Code:
Connecten:
Delphi-Quellcode:
procedure TForm1.btnServerConnectClick(Sender: TObject);
begin
if not TCPClient.Connected then
begin
TCPClient.Connect;
MemoLog.Lines.Add(FormatDateTime('',now)+' *** Successfully connected to Server');
end;
end;
TimerCycle.Enabled:=true;
end;
Timer-getriggertes String-holen des Clients:
Delphi-Quellcode:
procedure TForm1.GetData;
begin
with TCPClient do begin
try
S:=IOHandler.ReadLn;
MemoLog.Lines.Add(FormatDateTime('',now)+' '+S+' received');
finally
Disconnect;
end;
end;
end;
Und hier der Server:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
if not idTcpServer1.Active then
begin
idTCPserver1.Active:=true;
end;
Strings[0]:='00000000000000000000000000000000';
Strings[1]:='FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
with AContext.Connection.iohandler do
begin
WriteLn(Strings[Random(2)]);
end;
end;
Übrigens hat meine bisherige Lösung noch ein Problem: Nach ca.15 Min erscheint die Meldung "Gracefully Disconnected", wie kommt es dazu?
Vielen Dank, Gruß,
Klaxon.