2014-03-12 40 views
0

我希望能夠重新連接到一個idSimpleServer後,客戶端連接到它,然後斷開連接。第一個客戶端可以連接和斷開連接沒有問題,但下一個客戶端不能。我做了一個簡單的測試程序來證明我的問題。Indy的idSimpleServer重新連接

procedure Tfrmmain.btnBlockingClick(Sender: TObject); 
begin 
    Server1.BeginListen; 
    Server1.Listen; 
    CodeSite.Send(csmLevel2, 'Listen'); 
    CodeSite.Send(csmLevel2, 'Server1.IOHandler.Connected', Server1.IOHandler.Connected); 
    try 
    while (Server1.Connected) do 
    begin 
     while Server1.IOHandler.CheckForDataOnSource() do 
     begin 
     CodeSite.Send(csmLevel3, 'InputBufferAsString', Server1.IOHandler.InputBufferAsString); 
     Server1.IOHandler.WriteLn('0006CANPDD'); 
     end; 
    end; 
    finally 
    Server1.Disconnect; 
    CodeSite.Send(csmLevel4, 'Finally'); 
    end; 
end; 

這給我的代碼網站日誌如下結果:

Listen 
Server1.IOHandler.Connected = True 
Finally 
Listen 
Server1.IOHandler.Connected = False 
Finally 

公告似乎第二個連接不正確綁定的IOHandler。不知道我應該在哪裏看。有任何想法嗎?

感謝

史蒂夫

回答

1

的問題是要重複使用,每次同TIdSimpleServer對象。

第一次斷開連接後,同一個IOHandler被重新用於下一次連接,但IOHandler.ClosedGracefully屬性從早期連接保持爲真,因爲它沒有每次都被重置。 ClosedGracefully屬性僅通過IOHander.Open()方法重置,其中TIdSimpleServer僅在創建新的IOHandler時調用。 Disconnect()不釋放IOHandler,但它確實呼叫IOHandler.Close()

在後續連接上缺少對Open()的調用看起來像是一個bug,所以我已經在Indy的SVN(rev 5103)中檢查了它的修復。

您可以升級到latest SVN release,否則您將不得不銷燬每個連接之間的TIdSimpleServer.IOHandler(或TIdSimpleServer本身)。

+0

感謝您的解釋,真的很有用 - 非常感謝 – Steve