2012-11-15 128 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循環將只執行一次,如果沒有連接,你的線程將處於無限循環。