2012-09-21 105 views
2

我們正在開發一個帶有Delphi XE的新Datasnap服務器(tcp/ip)並且遇到了問題。我們不知道客戶端何時以異常方式斷開連接,連接斷開或客戶端計算機重新啓動。Delphi XE斷開或終止datasnap客戶端會話

當客戶端建立我們保存它的細節列表作爲這樣的連接:

TClientInfo = record 
    Id: integer; 
    Session: TDSSession; 
    LastSeen: TDateTime; 
end; 
... 
ClientInfoList: TDictionary<Integer, TClientInfo>; 
... 
//OnConnect  
ClientInfo.ClientId := ClientId; 
ClientInfo.Session := TDSSessionManager.GetThreadSession; 
ClientInfo.LastSeen := Now(); 
ClientInfoList.Add(ClientId, ClientInfo); 

理想的情況下,我們會想重複throught的ClientInforList並斷開尚未看到30分鐘的任何客戶端,但這是我遇到問題的地方。

我試圖斷開或終止客戶端會話,如下沒有任何運氣。

for i in ServerContainer.ClientInfoList.Keys do 
    begin  
    ClientInfo := TClientInfo(ServerContainer.ClientInfoList[i]); 
    ClientInfo.Session.Terminate; 
    end; 

在Delphi XE中有這樣做的方法嗎?

+0

'ServerClass.LifeCycle'如何設置? ['Server','Session','Invocation'] –

+0

LifeCycle設置爲[Session]。 –

回答

2

您不能從XE的服務器端終止TCP/IP會話。 Mat DeLong撰寫了一篇文章,解釋瞭如何在XE中使用HTTP時斷開會話與服務器端的連接,並以「」結尾。在XE中,此功能目前僅適用於HTTP連接,在XE2中也適用於TCP/IP。

我們XE過你同樣的問題。我們嘗試在會話線程中使用LifeCycle := Session和一個定時器來自行終止它,如果用戶在x小時內沒有看到。但是我們無法從內部終止線程。我們無法枚舉主線程中的線程連接。

所以我們將LifeCycle設置爲[Server],這樣我們就可以自己管理連接列表。我們必須處理所有通過[Session] LifeCycle自動發生的事情,但至少我們可以循環訪問連接列表並刪除LastSeen大於x小時的連接。

如果升級到XE2(現在是XE3)是一個選項,它可能是最好的選擇(因此您可以使用[Session]連接的會話管理方法)。

如果無法升級,則從服務器端終止會話的唯一方法是將LifeCycle設置爲[服務器]並自行執行會話管理。

+0

感謝您的信息。我不確定我們能夠使用[服務器],但我會看看。我們正試圖說服這種能力升級,但這是一個緩慢的過程。 –