Tcpclient.connected Problem in Delphi - Indy
-
27-10-2019 - |
Frage
Ich habe ein Problem mit Idtcpclient.connected Funktion von Indy in Delphi. Ich verwende die Indy10- und Delphi2010 -Umgebung. Mein Problem ist jedes Mal, wenn ich die TCP -Verbindung mit überprüfe Idtcpclient.connected, Es stellt mit diesen Fehlern Ausnahmen auf Eidsocketerror, EidreadTimeout. Gibt es eine Möglichkeit, die Verbindung zu trennen und wieder zu verbinden? (wie die Verbindung zurücksetzen).
Hinweis: Ich habe tcpclient.Retimeout: = 30000 gesetzt;
Die implementierte Codierung für das Zurücksetzen der Verbindung folgt.
if IdTCPclient.connected then
begin
IdTCPclient.IOHandler.InputBuffer.Clear;
IdTCPclient.Disconnect;
end;
sleep(1000);
try
IdTCPclient.connect;
except
on E: Exception do
MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
end;
Aber irgendwann bekomme ich eine Ausnahme und es konnte sich überhaupt nicht verbinden. Ich bin mir nicht sicher, was ich falsch mache.
Soll ich das tun?
- Zuerst trennen
- Eingabepuffer löschen
- TCPClient zerstören
- Neue tcpclient neu erstellen
- Und dann verbinden Sie es erneut
Wenn es der Fall ist, kann mir jemand eine Möglichkeit geben, wie ich es richtig machen kann?
Außerdem gibt es eine weitere Funktion, die TCP in meiner Codierung neu zu verbinden. Es gibt mir auch eine Ausnahme. Ich überprüfe die Verbindung, bevor ich eine Nachricht an TCP sende. Wenn es keine Verbindung gibt, verbinde ich mich fünfmal wieder.
result := IdTCPclient.connected
if not result then
begin
for k:=0 to 4 do
beign
sleep(1000);
try
TCPclient.connect;
except
on E: Exception do
MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
end
result := TCPclient.connected;
if result then break;
end;
Mit über zwei Codierung wird das Programm wiederhergestellt, um die Verbindung wieder zu verbinden und die Verbindung ziemlich gut zurückzusetzen. Irgendwann kann das Programm die Verbindung überhaupt nicht zusammenschließen oder zurücksetzen.
- Was soll ich tun, wenn ich eine Ausnahme bekomme? Soll ich wieder ausnahmslos verbinden?
- Wie erstellen wir die Codierung, um die Verbindung regelmäßig zu überprüfen?
- Wie erstellen wir die Codierung, um die Verbindung zurückzubekommen, wenn sie verloren hat?
Mit freundlichen Grüßen,
Lösung
Connected()
sollte überhaupt keine Ausnahmen erhöhen. Wenn ja, dann ist es wahrscheinlich ein Fehler. Bitte geben Sie eine Stapelverfolgung an.
Die beste Option ist, einfach die Verwendung zu vermeiden Connected()
wenn möglich. Wenn Sie eine E/A -Operation ausführen müssen, tun Sie dies einfach und lassen Sie Indy eine Ausnahme anziehen, wenn ein Fehler auftritt. Sie können dann in diesem Moment damit umgehen, z. B.:
try
IdTCPClient.DoSomething...
except
on E: EIdException do begin
Reconnect;
end;
end;
procedure Reconnect;
var
k: Integer;
begin
IdTCPClient.Disconnect;
if IdTCPClient.IOHandler <> nil then
IdTCPClient.IOHandler.InputBuffer.Clear;
for k := 0 to 4 do
begin
Sleep(1000);
try
IdTCPClient.Connect;
Exit;
except
on E: Exception do
begin
MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
if k = 4 then
raise;
end;
end;
end;
end;
Andere Tipps
Bevor Sie eine Verbindung herstellen