Delphi Datasnap和SocketError

Delphi Datasnap和SocketError,delphi,delphi-xe2,datasnap,Delphi,Delphi Xe2,Datasnap,我有一个带有vcl表单客户端的datasnap服务器。从客户端,我如何处理服务器是否已关闭并使用现有客户端连接重新启动?此场景引发10053 EIdSocketError异常 为了进行复制,我同时运行服务器和客户端,调用成功的服务器(我使用通过DataSnap代理生成器公开的方法)。然后我关闭服务器(如关闭应用程序)并重新启动它。然后我尝试再次呼叫服务器 例如: 客户电话 sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnect

我有一个带有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”调用或其他东西(比如方法TestConnection),以检查EIdSocketError(以及等效的)和句柄?或者这更像是一个设计缺陷


谢谢

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

我的场景:

  • 客户端应用程序连接到DataSnap服务器(TCP/IP,远程服务器)
  • 客户端请求数据集(使用DataSnap服务器方法)。TClientDataSet
  • 客户端下载的数据集
  • 服务器关闭(taskkill,关闭应用程序无所谓)
  • 客户端再次请求数据集(ehhrrr套接字错误)
解决方案:

  • 在客户端上,我捕获异常(AppEvents.OnException)
  • 识别连接到DataSnap服务器时发生的套接字错误
  • 我显示对话框窗口,其中包含连接丢失的信息。用户可以单击“重试”-如果是,
    • 释放并重新创建DataSnap客户端模块并初始化连接
    • 如果应用程序捕获异常整个过程从一开始就工作,请尝试请求数据集(连接测试的特殊数据集)
完成此操作后,我的客户端将重新连接到DataSnap服务器,并可以使用新的TCP/IP连接请求dataset。当然,用户可以关闭对话框,但随后应用程序被关闭

我想这对你有帮助。我尝试了许多其他的解决方案,但这证明是最好的。此外,该算法还支持与客户端故障的连接丢失