Domanda

Ho problemi con Idtcpclient.connected funzione di Indy a Delphi. Sto usando l'ambiente Indy10 e Delphi2010. Il mio problema è ogni volta che controllo la connessione TCP con Idtcpclient.connected, aumenta l'eccezione con questi errori Eidsocketerror, EidReadTimeout. C'è un modo per scollegare e riconnettere la connessione? (come ripristinare la connessione).

Nota: ho impostato TcpClient.retimeout: = 30000;

La codifica implementata per il ripristino è seguente.

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;

Ma un certo punto, ricevo un'eccezione e non poteva connettermi affatto. Non sono sicuro di cosa sto facendo di sbagliato.

Dovrei farlo?

  • Scollegare per primo
  • Cancella buffer di input
  • Distruggi TCPClient
  • Ricreare nuovo TCPClient
  • E poi collegalo di nuovo

In tal caso, qualcuno può fornirmi un modo per farlo correttamente?

Inoltre, c'è un'altra funzione per riconnettersi il TCP nella mia codifica. Mi dà anche un'eccezione. Controllo la connessione prima di inviare un messaggio a TCP. Se non c'è connessione, mi riconnettevo per cinque volte.

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 codifica sopra due, il programma gestisce la riconnessione e ripristina abbastanza bene la connessione. Ma un punto in cui il programma non può riconnettersi o ripristinare la connessione.

  • Cosa devo fare quando ricevo eccezione? Dovrei riconnettermi dall'eccezione?
  • Come si crea la codifica per controllare regolarmente la connessione?
  • Come possiamo costruire la codifica per recuperare la connessione quando ha perso?

Cordiali saluti,

È stato utile?

Soluzione

Connected() non dovrebbe sollevare alcuna eccezione. Se lo è, allora è probabilmente un bug. Si prega di fornire una traccia dello stack che lo mostra.

L'opzione migliore è semplicemente evitare di usare Connected() quando possibile. Quando devi eseguire un'operazione I/O, fallo e lascia che Indy aumenti un'eccezione se si verifica un guasto. Puoi quindi gestirlo in quel momento, ad esempio:

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;

Altri suggerimenti

Prima di connetterti, assicurarsi che il booleano passivo di IDFTP sia falso quando è necessario trasferimento del file Cambialo in true con l'opzione file binaria

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top