delphi – Datasnap和SocketError

前端之家收集整理的这篇文章主要介绍了delphi – 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;

我认为人们经常会遇到这种情况很容易复制.我应该在每次调用之前先进行“测试连接”调用或其他事情(例如方法TestConnection)来检查EIdSocketError(和等效的)并处理?或者它更像是一个设计缺陷?

谢谢

解决方法

我的情景:

>客户端应用程序连接到DataSnap Server(TCP / IP,远程服务器)
>客户端请求DataSet(使用DataSnap服务器方法).的TClientdataSet
>客户端下载的数据集
>服务器关闭(taskkill,关闭应用程序无关紧要)
>客户端请求一个DataSet(ehhrrr套接错误)

解:

>在客户端上我捕获异常(AppEvents.OnException)
>认识到连接到DataSnap服务器时出现Socket错误
>我显示对话框窗口,其中包含连接丢失的信息.用户可以点击“重试” – 如果是这样,

>免费并重新创建DataSnap客户端模块并初始化连接
>如果应用程序捕获异常整个过程从头开始工作,请尝试请求数据集(用于连接测试的特殊数据集).

完成此操作后,我的客户端重新连接到DataSnap服务器,并可以使用新的TCP / IP连接请求数据集.当然用户可以关闭对话框,但然后关闭应用程序.

我想这可以帮到你.我尝试了很多其他解决方案,但事实证明这是最好的.此外,算法还支持失去与客户端故障的连接.

猜你在找的Delphi相关文章