2012-11-15 80 views
4

我正在编写一个应用程序,它使用TIdTCPClient通过套接字与另一个应用程序进行通信。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中捕获此异常?

+0

'TIdTCPClient.Connect'是同步的,所以你发布的代码是很好的,除了你应该修改你的循环来检查线程'终止'标志像''而不是终止,而不是IsConnected做'和除您可以进入无限连接尝试循环。但是,在调用'TcpClient.Connect;'之后,您无法到达'IsConnected:= True'行并且连接失败。 – TLama

+0

将condition改为'while(不是IsConnected)和(不是Terminated)do'不会修复错误(尝试它)。 –

+0

我知道,这只是对如何修改该循环的建议:-)我看不到任何*错误*。你有没有调试过这段代码?我敢打赌,我的代表500中,如果你试图连接到一个不存在的服务器,你永远不会到达'IsConnected:= True'行(用当前代码)设置的断点。 – TLama

回答

2

有没有代码修改必要的。*你的程序是已经捕获预期的异常。

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

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

*雷米的回答描述改进你可以让你的代码捕捉其他可能的例外。

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

while循环在这里不是必须的,因为你已经在一个线程中执行,而while循环将只执行一次,如果没有连接,你的线程将处于无限循环。