Apache 使用HTTP协议的Delphi回调服务器总是在几分钟后超时

Apache 使用HTTP协议的Delphi回调服务器总是在几分钟后超时,apache,http,delphi,delphi-10.2-tokyo,webbroker,Apache,Http,Delphi,Delphi 10.2 Tokyo,Webbroker,我在Delphi Tokyo中设置回调服务器时遇到问题。我已经设置了Datasnap WebBroker服务器,然后使用 FDSCallBackClientManager.RegisterCallback(sCallbackID,FDSCallBack); 在我的客户端上连接回调服务器,它可以连接,我可以向其他客户端发送广播消息,但在连接几分钟后,它将断开连接,当我尝试广播消息时,它将引发异常,告知通信超时 我使用HTTP协议进行连接,使用TCP/IP协议时不会发生这种情况。该代码只是创建面向

我在Delphi Tokyo中设置回调服务器时遇到问题。我已经设置了Datasnap WebBroker服务器,然后使用

FDSCallBackClientManager.RegisterCallback(sCallbackID,FDSCallBack);
在我的客户端上连接回调服务器,它可以连接,我可以向其他客户端发送广播消息,但在连接几分钟后,它将断开连接,当我尝试广播消息时,它将引发异常,告知通信超时

我使用HTTP协议进行连接,使用TCP/IP协议时不会发生这种情况。该代码只是创建面向Apache的webbroker应用程序的向导。下面是SQLConnection的代码:

FConnection.Params.Values['CommunicationIPVersion'] := 'IP_IPv4';
  FConnection.Params.Values['Hostname'] :=
    TCSClass_Configuration.ReadConfig(
      ClientVariables.Config.FileName,
      AProfile,
      'Hostname',
      'localhost'
    );
  FConnection.Params.Values['Port'] :=
    TCSClass_Configuration.ReadConfig(
      ClientVariables.Config.FileName,
      AProfile,
      'WebPort',
      '80'
    );
  FConnection.Params.Values['DatasnapContext'] :=
    TCSClass_Configuration.ReadConfig(
      ClientVariables.Config.FileName,
      AProfile,
      'DatasnapContext',
      'datasnap'
    );
  FConnection.Params.Values['URLPath'] :=
    TCSClass_Configuration.ReadConfig(
      ClientVariables.Config.FileName,
      AProfile,
      'URLPath',
      'rest'
    );
  FConnection.Params.Values['ConnectTimeout'] :=
    TCSClass_Configuration.ReadConfig(
      ClientVariables.Config.FileName,
      AProfile,
      'ConnectTimeOut',
      '1000'
    );
  FConnection.Params.Values['CommunicationTimeout'] :=
    TCSClass_Configuration.ReadConfig(
      ClientVariables.Config.FileName,
      AProfile,
      'CommunicationTimeOut',
      '1000'
    );
下面是连接回调服务器的代码:

FDSCallBackClientManager.ChannelName := FCallbackChannelName;
FDSCallBackClientManager.DSHostname :=
  FConnection.Params.Values['Hostname'];
FDSCallBackClientManager.DSPort :=
  FConnection.Params.Values['Port'];
FDSCallBackClientManager.DSPath :=
  FConnection.Params.Values['URLPath'];
FDSCallBackClientManager.CommunicationProtocol :=
  FConnection.Params.Values['CommunicationProtocol'];
FDSCallBackClientManager.ConnectionTimeout :=
  FConnection.Params.Values['ConnectTimeout'];
FDSCallBackClientManager.CommunicationTimeout :=
  FConnection.Params.Values['CommunicationTimeout'];

sManagerID := TDSTunnelSession.GenerateSessionId;
sCallbackID := TDSTunnelSession.GenerateSessionId;

FDSCallBackClientManager.ManagerId := sManagerID;

if FDSCallBack = nil then
begin
  FDSCallBack := TCSClass_Callback.Create(
    Self,
    sManagerID,
    sCallbackID
  );
end;
FDSCallBackClientManager.RegisterCallback(sCallbackID,FDSCallBack);

有谁能给我一些建议我错过了什么

这就是http的局限性——即使您以客户机-服务器方式使用它,它也会超时。因此,不能使用http设置回调。相反,您必须使用tcp/ip——即使使用tcp/ip,您也必须设置一些保持活动的机制,因为这也超时了,只需要比http长得多。您好,感谢您提供的信息,我的想法是相同的,但有一个示例使用Javascript客户端的回调,可以将文本发送到web客户端。这是链接,由Mat DeLong制作。因此,为了使http回调成为可能,必须进行一些设置。有一种方法可以为http(基于web的)瘦客户机设置回调。这里的客户端不是Windows可执行文件,而是在浏览器中运行的javascript网页,用于在执行回调时使网页的某些部分自我刷新。因为我不是一个网络开发人员,所以我没有尝试过。但你可能会更成功。在()有一个起点,如果您只是实现一个keep-alive,那么使用您已经测试过的机制可能会取得一些成功。要做到这一点,只需在频道上定期播放预定义的短消息。对于http,您可以每30秒尝试一次,看看回调连接是否“保持正常”。您好@nolaspeaker,感谢您提供的提示,我已经找到了这篇文章,但我自己还没有尝试过,我会尝试一下,对于keep alive解决方案,我已经尝试过了,它正在工作,但这会使回调变得毫无用处,因为我可以直接使用间隔来请求新信息,而不是一开始就使用回调。我先试试这篇文章。谢谢