Datasnap和SocketError
我有一个带有vcl表单客户端的datasnap服务器。 从客户端,如果服务器已经关闭并重新启动现有的客户端连接,我该如何处理? 这种情况引发了一个10053 EIdSocketError异常。
要复制,我运行服务器和客户端,调用服务器(我使用通过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)并处理? 或者更多的是设计缺陷?
谢谢
我的场景:
解:
完成此操作后,我的客户端重新连接到DataSnap服务器,并可以使用新的TCP / IP连接请求数据集。 当然用户可以关闭对话框,但是应用程序关闭。
我认为这可以帮助你。 我尝试了许多其他解决方案,但事实证明这是最好的。 此外,算法还支持与客户端故障的连接丢失。
此问题最简单的解决方法是将TDSServerClass LifeCycle属性更改为调用。 这将导致您拥有一个无状态的服务器,并且服务器将为每个请求创建一个新的会话。 但是,您将能够在不中断客户端连接的情况下关闭并重新连接服务器。
链接地址: http://www.djcxy.com/p/11103.html