TIdTCPClient:重新连接实现

时间:2012-11-15 13:13:09

标签: delphi delphi-2009 indy

我正在编写一个应用程序,它使用TIdTCPClient通过套接字与另一个应用程序进行通信。

我希望应用程序尝试连接到某个服务器,直到建立连接(即直到服务器上线)。

为了做到这一点,我写了以下代码:

procedure SendingThread.Execute();
var
I : integer;
Test : string;
IsConnected : Boolean;
begin
    TcpClient := TIdTCPClient.Create;
    TcpClient.Host := '127.0.0.1';
    TcpClient.Port := 9999;
    TcpClient.ConnectTimeout := 60000;

    IsConnected := false;
    while not IsConnected do
        begin
        try
            TcpClient.Connect;
            IsConnected := True;
        except
            on E:EIdSocketError do
                IsConnected := false;
        end;
    end;
...
end;

当我在服务器处于脱机状态时运行此代码时,我得到EIdSocketError错误代码10061TcpClient.Connect;之后抛出异常。

如何修改代码以便在except导致此异常?

3 个答案:

答案 0 :(得分:2)

您展示的代码是处理重新连接问题的正确方法,但您需要进行一项小的更改。更改except块以捕获ExceptionEIdException而不是EIdSocketErrorEIdSocketError不是Connect()可能引发的唯一可能例外。例如,它可能会引发EIdConnectExceptionEIdConnectTimeout,这两者都不是EIdSocketError派生的。

procedure SendingThread.Execute;
var
  ...
  IsConnected : Boolean;
begin
  ...
  IsConnected := False;
  while (not IsConnected) and (not Terminated) do
  begin
    try
      TcpClient.Connect;
      IsConnected := True;
    except
      on E: Exception do
        IsConnected := False;
    end;
  end;
  ...
end;

您也可以完全删除on E子句,因为它没有做任何有用的事情。引发异常时IsConnected变量已经为False,因此无需将其重新分配给相同的值。

procedure SendingThread.Execute;
var
  ...
  IsConnected : Boolean;
begin
  ...
  IsConnected := false;
  while (not IsConnected) and (not Terminated) do
  begin
    try
      TcpClient.Connect;
      IsConnected := True;
    except
    end;
  end;
  ...
end;

答案 1 :(得分:2)

无需修改代码。*您的程序捕获预期的异常。

您所看到的是调试器在您的程序有机会查看异常并对其执行任何操作之前立即拦截异常。当IDE中断您时,它会显示一个对话框,为您提供继续运行的选项。执行该选项,或在关闭对话框后按“运行”按钮。

您可以将调试器配置为忽略部分或全部异常,这在使用Indy时特别有用,因为Indy倾向于使用异常进行正常流控制。 How to do that has been covered here before.

* Remy的回答描述了您可以对代码进行的改进以捕获其他可能的异常。

答案 2 :(得分:-1)

虽然这里不需要循环,因为你已经在一个线程执行中,这个while循环只会执行一次,如果没有连接,你的线程将处于一个无限循环中。