TCPClient. Problema conectado en Delphi - Indy
-
27-10-2019 - |
Pregunta
Estoy teniendo problemas con Idtcpclient.conectado función de Indy en Delphi. Estoy usando el entorno Indy10 y Delphi2010. Mi problema es cada vez que reviso la conexión TCP con Idtcpclient.conectado, plantea excepción con estos errores EidsockockError, Eidreadtimeout. ¿Hay alguna forma de desconectar y reconectar la conexión? (como restablecer la conexión).
Nota: Establecí tcpClient.retIeout: = 30000;
Se sigue la codificación implementada para restablecer la conexión.
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;
Pero en algún punto, obtengo una excepción y no pudo conectarme en absoluto. No estoy seguro de lo que estoy haciendo mal.
¿Debería hacer esto?
- Desconectar primero
- Bordeador de entrada claro
- Destruir tcpclient
- Recreate el nuevo TCPClient
- Y luego conectarlo de nuevo
Si es el caso, ¿alguien puede proporcionarme una forma de hacerlo correctamente?
Además, hay otra función para volver a conectar el TCP en mi codificación. También me da excepción. Reviso la conexión antes de enviar un mensaje a TCP. Si no hay conexión, me vuelvo a conectar por cinco veces.
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;
Con la codificación superior de dos, el programa maneja la reconectación y restablece la conexión bastante bien. Pero en algún punto del programa no puede volver a conectar o restablecer la conexión en absoluto.
- ¿Qué debo hacer cuando obtengo la excepción? ¿Debo volver a conectarme de la excepción?
- ¿Cómo construimos la codificación para verificar la conexión regularmente?
- ¿Cómo construimos la codificación para recuperar la conexión cuando se perdió?
Atentamente,
Solución
Connected()
No debe estar planteando ninguna excepción en absoluto. Si es así, entonces es probable que sea un error. Proporcione un rastro de pila que muestre eso.
La mejor opción es simplemente evitar usar Connected()
cuando sea posible. Cuando necesite realizar una operación de E/S, solo hágalo y deje que Indy plantee una excepción si se produce una falla. Luego puedes manejarlo en ese momento, por ejemplo:
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;
Otros consejos
Antes de conectarse, asegúrese de que el booleano pasivo de IDFTP sea falso cuando necesita que el archivo transfiera, cambielo a verdadero con la opción de archivo binario