Question

J'ai problème avec IdTCPclient.connected fonction de Indy en Delphi. J'utilise l'environnement Indy10 et Delphi2010. Mon problème est à chaque fois que je vérifie la connexion TCP avec IdTCPclient.connected , elle soulève exception avec ces erreurs EidSocketError , EidReadTimeOut . Est-il possible de déconnecter et reconnecter la connexion? (Comme réinitialiser la connexion).

Note: je mets TCPClient.ReTimeout: = 30000;

La mise en œuvre codant pour réinitialiser la connexion est suivi.

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;

Mais un moment donné, je me exception et il ne pouvait pas se connecter du tout. Je ne sais pas ce que je fais mal.

dois-je faire cela?

  • Se déconnecter premier
  • tampon d'entrée Effacer
  • Destroy tcpclient
  • Re-créer un nouveau tcpclient
  • Et puis reconnectez

Si tel est le cas, quelqu'un peut me fournir un moyen comment faire correctement?

En outre, il y a une autre fonction de reconnecter le TCP dans mon codage. Il me donne aussi exception aussi. Je vérifie la connexion avant d'envoyer un message à TCP. S'il n'y a pas de connexion, je rebranche cinq fois.

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;

Avec plus de deux codage, poignées de programme et reconnectant réinitialiser la connexion assez bien. Mais un certain point le programme ne peut pas re-connecter ou réinitialiser la connexion du tout.

  • Que dois-je faire quand je reçois exception? Au cas où je vous reconnecter à partir exception?
  • Comment construire le codage pour vérifier la connexion régulièrement?
  • Comment construire le codage pour revenir la connexion quand il a perdu?

Cordialement,

Était-ce utile?

La solution

Connected() ne doit pas être soulevé des exceptions à tous. Dans ce cas, alors il est probablement un bug. S'il vous plaît fournir une trace de pile montrant que.

La meilleure option est d'éviter tout simplement en utilisant Connected() chaque fois que possible. Lorsque vous avez besoin d'effectuer une opération d'E / S, le faire ainsi, et laisser lever Indy une exception si une panne survient. Vous pouvez ensuite gérer à ce moment-là, par exemple:

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;

Autres conseils

avant de faire en sorte que la connexion booléenne passive de idftp est faux lorsque vous avez besoin de déposer à changer transfert vrai avec l'option de fichier binaire

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top