2

Delphi の Indy のIdTCPclient.connected関数に問題があります。Indy10 と Delphi2010 環境を使用しています。私の問題は、 IdTCPclient.connected で TCP 接続をチェックするたび、これらのエラーEidSocketErrorEidReadTimeOutで例外が発生することです。接続を切断して再接続する方法はありますか? (接続をリセットするなど)。

注: 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;

しかし、ある時点で例外が発生し、まったく接続できませんでした。何が間違っているのかわかりません。

これを行う必要がありますか?

  • 最初に切断する
  • 入力バッファをクリア
  • TCP クライアントを破棄する
  • 新しい TCP クライアントを再作成する
  • そして、もう一度接続します

もしそうなら、誰かがそれを適切に行う方法を教えてもらえますか?

また、コーディングで 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 つのコーディングにより、プログラムは再接続を処理し、接続を適切にリセットします。しかし、ある時点で、プログラムは再接続または接続をまったくリセットできません。

  • 例外が発生した場合はどうすればよいですか? 例外から再接続する必要がありますか?
  • 接続を定期的にチェックするためのコーディングをどのように構築すればよいでしょうか?
  • 接続が失われたときに接続を取り戻すためのコーディングをどのように構築すればよいでしょうか?

敬具、

4

2 に答える 2

6

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;
于 2011-05-02T08:58:56.397 に答える