problème TCPclient.connected à Delphes - Indy
-
27-10-2019 - |
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,
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