繁体   English   中英

Datasnap和SocketError

[英]Datasnap and 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连接请求数据集。 当然用户可以关闭对话框,但随后关闭应用程序。

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

此问题最简单的解决方法是将TDSServerClass LifeCycle属性更改为Invocation。 这将使您拥有无状态服务器,并且服务器将为每个请求创建一个新会话。 但是,您将能够在不中断客户端连接的情况下关闭并重新连接服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM