TCPCLIENT.CONNECT PROBLEMA IN DELPHI - INDY
-
27-10-2019 - |
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,
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