Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.953 Beiträge
 
Delphi 12 Athens
 
#1

Wo im Client auf Nachrichten vom Server warten?

  Alt Heute, 13:06
Ich will in einem TIDTCPClient Dauerhaft eine Verbindung zum TCPServer halten und auf Messages vom Server warten.
Wo mache ich das am besten?
Brauche ich dafür einen eigenen thread oder passiert das schon alles in IndyThreads?

Zurzeit Habe ich einen kleinen Handshake in OnClientConnect
der so aussieht.

Delphi-Quellcode:
procedure TFTAPPRCMain.OnClientConnected(Sender: TObject);
begin
  var ClientLeaseRequest :TClientLeaseRequestMessage;
  ClientLeaseRequest.Init;
  ClientLeaseRequest.LeaseKey := LEASEKEY;
  RClient.IOHandler.Write(ClientLeaseRequest.ToIdBytes);
  If RClient.IOHandler.InputBufferIsEmpty then
  Begin
    RClient.IOHandler.CheckForDataOnSource(1000);
    RClient.IOHandler.CheckForDisconnect;
    if RClient.IOHandler.InputBufferIsEmpty then
      Exit;
  end;
  var IDbytes:TidBytes;
  RClient.IOHandler.InputBuffer.ExtractToBytes(IDbytes);
  var ClientLeaseResponse :TClientLeaseResponseMessage;
  ClientLeaseResponse.LoadFromIDBytes(IDbytes);
  If (ClientLeaseResponse.MSGType = $0002 ) and
     (ClientLeaseResponse.MagicCookie = MagicCookie) and
     (ClientLeaseResponse.MSGVersion = 1) then
  Begin
    LeaseCode := ClientLeaseResponse.MSGReturnCode;
    TThreadedLog.LogD('ClientLeaseResponse ReturnCode ='+ClientLeaseResponse.MSGReturnCode.ToString);

    // Soll Ich hier ne "While Active" schleife mit
    // Sowas in der Art platzieren?
    (*
      While Active do
      Begin
        If RClient.IOHandler.InputBufferIsEmpty then
        Begin
          RClient.IOHandler.CheckForDataOnSource(1000);
          RClient.IOHandler.CheckForDisconnect;
          if RClient.IOHandler.InputBufferIsEmpty then
            Continue;
        end;
        var IDbytes:TidBytes;
        RClient.IOHandler.InputBuffer.ExtractToBytes(IDbytes);   
        Logik(IDBytes); // Oder TLogikthread.create(IDbytes).start; ???
      end;
    *)

    
  End;
end;
Oder sollte ich die Ganze Schleife zum warten auf Nachrichten in einen anderen Thread packen statt in OnClientConnected?
Passiert OnClientConnected im Hauptthread oder in einem Indy Thread?
Ich weiß, dass ich das alles durch Experimente rauskriegen kann...es wäre halt nur toll wenn einer das alles wüsste und ich es gleich richtig machen könnte.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (Heute um 13:10 Uhr)
  Mit Zitat antworten Zitat