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,

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top