![]() |
TIdTCPClient "Conntection closed gracefully" obwohl Connected
Hi,
ich sende mit einem TIdTCPClient etwas zu einem TIdTCPServer und will auf dessen Anwort warten. Zu diesem Zweck heba ich eine Thread der beim TIdTCPClient.Connected erzeugt wird und beim TIdTCPClient.Disconnected wieder terminiert wird. (Delphi 10.3 + Indy 10)
Delphi-Quellcode:
In der Procedure Execute kommt es in der Zeile "FData := FClient.IOHandler.ReadLn;" zu eine EIdconnClosedGracefully, obwohl kurz darüber FClient.Connected noch True sein muss.
unit uIdTCPClientThread;
interface uses System.Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdCmdTCPClient; type TDataEvent = procedure(const Data: string) of object; TReadingThread = class(TThread) private FClient: TIdTCPClient; FData: string; FOnData: TDataEvent; procedure DataReceived; protected procedure Execute; override; public constructor Create(AClient: TIdTCPClient); reintroduce; property OnData: TDataEvent read FOnData write FOnData; end; implementation constructor TReadingThread.Create(AClient: TIdTCPClient); begin inherited Create(True); FClient := AClient; end; procedure TReadingThread.Execute; begin while not Terminated do begin if not FClient.Connected then begin self.Terminate; exit; end; FData := FClient.IOHandler.ReadLn; if (FData <> '') and Assigned(FOnData) then Synchronize(DataReceived); end; end; procedure TReadingThread.DataReceived; begin if Assigned(FOnData) then FOnData(FData); end; end. Im Mainthread wird nix disconnected. Woran kann das liegen. Gibt es sowas wie Autodisconnect im Server oder client? |
AW: TIdTCPClient "Conntection closed gracefully" obwohl Connected
Soweit ich das verstanden habe, kommt diese Fehlermeldung, wenn der Server die Verbindung geschlossen hat.
Welcher Zustand am Client herrscht, herrschen müsste, erwartet wird ..., ist dabei belanglos. ![]() Mögliche Ursachen: Die an den Server gestellte Anfrage kann von ihm nicht beantwortet werden, ist falsch, ist nicht zulässig (Schreibfehler, nicht verarbeitbare Daten(kombination)), ... |
AW: TIdTCPClient "Conntection closed gracefully" obwohl Connected
Okay, dann suche ich am falschen Ende.
Aber warum schließt der Server die Verbindung?
Delphi-Quellcode:
Läuft auch durch, aber wird direkt TIdTCPServer.OnDisconnect ausgelöst. Nur warum? Sollte die Verbindung nicht aufrecht gehalten werden?
procedure TForm2.idtcpsrvr1Execute(AContext: TIdContext);
var text: string; tmpClient: TClient; JsonObj: TJSONObject; begin text:=AContext.Connection.Socket.ReadLn; if mmo1.Lines.Count=0 then mmo1.Lines.Add(text) else mmo1.Lines.Insert(0, text); if Copy(Text.ToLower, 1, 4)='open' then begin JsonObj:=TJSONObject.Create; try JsonObj.ParseJSONValue(Copy(text, Pos('#', text)+1, length(text))); tmpClient:=TJSON.JsonToObject<TClient>(JsonObj); if ClientList.IndexOfGUID(tmpClient.GUID)=-1 then ClientList.AssignAsNew(tmpClient) else tmpClient.AssignTo(ClientList[ClientList.IndexOfGUID(tmpClient.GUID)]); finally if Assigned(tmpClient) then tmpClient.Free; JsonObj.Free; end; AContext.Connection.Socket.WriteLn('users#'+ClientList.GetAsJSONString); //<-kommt beim Client nicht an AContext.Connection.Socket.WriteLn('exit#'); //<-kommt beim Client nicht an end; end; |
AW: TIdTCPClient "Conntection closed gracefully" obwohl Connected
Das liegt am Server, der hat entweder ein grundlegendes Problem oder ein Problem mit Deiner Anfrage.
Bitte prüfe zuerst, ob die an den Server geschickten Daten formal und inhaltlich korrekt sind. Wenn Du das eindeutig bejahen kannst, musst Du wohl oder übel auf dem Server nachschauen, ob dort das, was Du dahin schickst, dort auch so ankommt, wie es vom Server erwartet wird. Ansonsten dashier lesen: ![]() Dort wird eine weitere mögliche Nutzung der "Exception - Conntection closed gracefully" beschrieben. Grob gesagt: Wenn der Server seinen Job erledigt hat, dann schließt er die Verbindung. Der Client hat das dann zur Kenntnis zu nehmen. Sprich: "Conntection closed gracefully" ist nicht zwingend ein Fehler, sondern eine ganz bewusst eingesetzte Art, die Kommunikation zwischen Server und Client zu steuern, in diesem Fall die Verbindung zu beenden. Diese Exception kann ein absolut korrekter Verarbeitungsschritt im Programmablauf sein. Wie die Behandlung dieser Kommunikationsmöglichkeit in Deinem konkreten Fall auszusehen hat, kann ich nicht sagen, da fehlt mir schlicht und einfach jeglicher Ansatz von Ahnung zu ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz