Delphi Datasnap和SocketError
我有一个带有vcl表单客户端的datasnap服务器。从客户端,我如何处理服务器是否已关闭并使用现有客户端连接重新启动?此场景引发10053 EIdSocketError异常 为了进行复制,我同时运行服务器和客户端,调用成功的服务器(我使用通过DataSnap代理生成器公开的方法)。然后我关闭服务器(如关闭应用程序)并重新启动它。然后我尝试再次呼叫服务器 例如: 客户电话Delphi Datasnap和SocketError,delphi,delphi-xe2,datasnap,Delphi,Delphi Xe2,Datasnap,我有一个带有vcl表单客户端的datasnap服务器。从客户端,我如何处理服务器是否已关闭并使用现有客户端连接重新启动?此场景引发10053 EIdSocketError异常 为了进行复制,我同时运行服务器和客户端,调用成功的服务器(我使用通过DataSnap代理生成器公开的方法)。然后我关闭服务器(如关闭应用程序)并重新启动它。然后我尝试再次呼叫服务器 例如: 客户电话 sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnect
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客户端模块并初始化连接
- 如果应用程序捕获异常整个过程从一开始就工作,请尝试请求数据集(连接测试的特殊数据集)