【问题标题】:Datasnap and SocketErrorDatasnap 和 SocketError
【发布时间】:2012-08-13 05:10:41
【问题描述】:

我有一个带有 vcl 表单客户端的数据快照服务器。从客户端,如果服务器已关闭并使用现有客户端连接重新启动,我该如何处理?这种情况会引发 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(和等效项)并进行处理?还是更多的设计缺陷?

谢谢

【问题讨论】:

    标签: delphi delphi-xe2 datasnap


    【解决方案1】:

    我的场景:

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

    解决方案:

    • 在客户端我捕获异常 (AppEvents.OnException)
    • 识别出连接到 DataSnap 服务器的 Socket 错误
    • 我显示对话窗口,其中包含连接丢失的信息。用户可以点击“重试” - 如果是这样,
      • 释放并重新创建 DataSnap 客户端模块并初始化连接
      • 如果应用程序捕获异常整个过程从头开始工作,请尝试请求数据集(用于连接测试的特殊数据集)。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-10-04
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        相关资源
        最近更新 更多