質問

私は問題を抱えています 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に変更します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top