gpt4 book ai didi

delphi - 数据快照和套接字错误

转载 作者:行者123 更新时间:2023-12-03 14:54:14 26 4
gpt4 key购买 nike

我有一个带有 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,关闭应用程序无关紧要)
  • 客户端再次请求数据集(ehhrrr 套接字错误)

解决方案:

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

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

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

关于delphi - 数据快照和套接字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11928483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com