TCPCLIENT.DELPHIの接続問題-Indy
-
27-10-2019 - |
質問
私は問題を抱えています idtcpclient.connected デルファイのインディの機能。 Indy10およびDelphi2010環境を使用しています。私の問題は、TCP接続をと確認するたびに idtcpclient.connected, 、これらのエラーで例外を提起します EidSocketError, eidreadtimeout. 。接続を切断して再接続する方法はありますか? (接続のリセットなど)。
注:tcpclient.retimeout:= 30000を設定します。
接続をリセットするために実装されたコーディングが続きます。
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;
しかし、いくつかのポイント、私は例外を取得し、まったく接続できませんでした。何が間違っているのかわかりません。
私はこれをすべきですか?
- 最初に切断します
- クリア入力バッファー
- tcpclientを破壊します
- 新しいtcpclientを再現します
- そして、もう一度接続します
もしそうなら、誰かが私にそれを適切に行う方法を提供することができますか?
また、コーディングでTCPを再接続する別の機能があります。また、私にも例外を与えます。 TCPにメッセージを送信する前に、接続を確認します。接続がない場合は、5回再接続します。
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;
上記の2つのコーディングで、プログラムは再接続して接続をかなりうまくリセットします。しかし、プログラムが接続を再接続またはリセットすることはまったくリセットできないポイントがあります。
- 例外を取得したらどうすればよいですか?例外から再接続する必要がありますか?
- 接続を定期的にチェックするためにコーディングを構築するにはどうすればよいですか?
- 接続が失われたときに接続を取り戻すためにコーディングを構築するにはどうすればよいですか?
敬具、
解決
Connected()
例外をまったく提起すべきではありません。もしそうなら、それはおそらくバグです。それを示すスタックトレースを提供してください。
最良の選択肢は、単に使用を避けることです Connected()
いつでも可能なとき。 I/O操作を実行する必要がある場合は、障害が発生した場合にIndyに例外を提起させてください。その後、その時点でそれを処理できます。
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;
他のヒント
接続する前に、ファイル転送が必要なときにIDFTPのパッシブブールが偽りであることを確認してください。バイナリファイルオプションでtrueに変更します