我有一个带有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;
我认为人们经常会遇到这种情况很容易复制.我应该在每次调用之前先进行“测试连接”调用或其他事情(例如方法TestConnection)来检查EIdSocketError(和等效的)并处理?或者它更像是一个设计缺陷?
谢谢
解决方法
我的情景:
>客户端应用程序连接到DataSnap Server(TCP / IP,远程服务器)
>客户端请求DataSet(使用DataSnap服务器方法).的TClientdataSet
>客户端下载的数据集
>服务器关闭(taskkill,关闭应用程序无关紧要)
>客户端请求一个DataSet(ehhrrr套接字错误)
解:
>在客户端上我捕获异常(AppEvents.OnException)
>认识到连接到DataSnap服务器时出现Socket错误
>我显示对话框窗口,其中包含连接丢失的信息.用户可以点击“重试” – 如果是这样,
>免费并重新创建DataSnap客户端模块并初始化连接
>如果应用程序捕获异常整个过程从头开始工作,请尝试请求数据集(用于连接测试的特殊数据集).
完成此操作后,我的客户端重新连接到DataSnap服务器,并可以使用新的TCP / IP连接请求数据集.当然用户可以关闭对话框,但然后关闭应用程序.