我有一个带有vcl窗体客户端的数据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”调用或其他东西(例如方法TestConnection)来检查EIdSocketError (和等效的)和句柄?或者更多的是一个设计缺陷?
谢谢
发布于 2014-04-28 21:16:24
我的场景:
解决方案:
在此操作之后,我的客户端重新连接到DataSnap服务器,并可以使用新的TCP/IP连接请求数据集。当然,用户可以关闭对话框,但是应用程序被关闭了。
我觉得这能帮到你。我尝试了许多其他的解决方案,但事实证明,这是最好的。此外,算法还支持与客户端的错误失去连接。
发布于 2013-07-22 16:17:13
解决此问题的最简单方法是将TDSServerClass LifeCycle属性更改为调用。这将导致您拥有一个无状态服务器,并且服务器将在每个请求中创建一个新会话。但是,您可以在不中断客户端连接的情况下关闭和重新连接服务器。
https://stackoverflow.com/questions/11928483
复制相似问题