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,

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top