2012-08-13 61 views
7

我有一個帶有vcl表單客戶端的datasnap服務器。從客戶端,如果服務器已經關閉並重新啓動現有的客戶端連接,我該如何處理?這種情況引發了一個10053 EIdSocketError異常。Datasnap和SocketError

要複製,我運行服務器和客戶端,調用服務器(我使用通過DataSnap代理生成器公開的方法)成功。然後關閉服務器(例如關閉應用程序)並重新啓動它。然後我嘗試再次打電話給服務器。

如: 客戶端調用

sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnection1.DBXConnection); 
    try 
     ds := sm.SearchPolicyByPolicy(40, WCRef, '', 3); 
     dspPolicyGroup.DataSet := ds; 

     if cdsPolicyGroup.Active then 
     cdsPolicyGroup.Refresh 
     else 
     cdsPolicyGroup.Open; 

    finally 
     sm.Free; 
    end; 

dspPolicyGroup是一個TDataSetProvider和cdsPolicyGroup是一個TClientDataSet(我只是用它來本地 「存儲」 我的TDataSet的結果)。

服務器

function TsvrPolicySearch.SearchPolicyByPolicy(AClientId: Integer; WCRefNum, ClientRef: string; SearchMethod: Integer): TDataSet; 
begin 
    spPolicyByWCRef.Close; 
    spPolicyByWCRef.ParamByName('p_client').AsInteger := AClientId; 
    spPolicyByWCRef.ParamByName('p_search_method').AsInteger := SearchMethod; 
    spPolicyByWCRef.ParamByName('p_wc_refno').AsString := WCRefNum; 
    spPolicyByWCRef.Open; 
    Result := spPolicyByWCRef; 
end; 

我認爲這是定期,人們看不出這是很容易複製遇到。我應該在每次調用EIdSocketError(及其等價物)之前先調用「Test Connection」調用或其他方法(如方法TestConnection)並處理?或者更多的是設計缺陷?

感謝

回答

1

這個問題最簡單的解決方法是改變TDSServerClass生命週期屬性來調用。 這將導致您擁有無狀態的服務器,並且服務器將爲每個請求創建一個新的會話。但是,您將能夠在不中斷客戶端連接的情況下關閉並重新連接服務器。

2

我的情景:

  • 客戶端應用程序連接到DataSnap服務器(TCP/IP,遠程服務器)
  • 客戶端請求數據集(使用DataSnap服務器的方法)。的TClientdataSet
  • 客戶端下載的數據集
  • 關閉服務器(TASKKILL,靠近申請事項)
  • 客戶端請求的數據集againt(ehhrrr套接字錯誤)

解決方案:

  • 在客戶端我捕獲異常(AppEvents.OnException)
  • 識別出連接到DataSnap服務器時發生套接字錯誤
  • 我用對話窗口顯示連接丟失的信息。用戶可以點擊「重試」 - 如果是這樣,
    • 免費並重新創建DataSnap客戶機模塊和初始化連接
    • 嘗試請求數據集(用於連接測試專用數據集),如果應用程序捕獲異常的整個過程,從開始工作。

此操作後,我的客戶端重新連接到DataSnap服務器,並且可以使用新的TCP/IP連接請求數據集。當然用戶可以關閉對話框,但是應用程序關閉。

我認爲這可以幫助你。我嘗試了許多其他解決方案,但事實證明這是最好的。此外,算法還支持與客戶端故障的連接丟失。