使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时

Posted

技术标签:

【中文标题】使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时【英文标题】:Setting KeepAlive Timeout in Delphi 2010 with indy 10.5.8 【发布时间】:2014-08-06 14:35:44 【问题描述】:

我正在使用 Delphi 2010 和 Indy 10.5.8

我正在尝试了解我们如何使用 keepalive 功能。我遇到了一种方法SetKeepAliveValues,我们在其中明确设置了keepalive 超时期限,还发现a link 根据哪个连接的ReadTimeout 或SessionTimeOut 将模仿相同。在我的服务器程序中,我为 IdHttpServer 定义了一个 SessionTimeOut

  WebServer := TIdHTTPServer.Create(nil);
  WebServer.SessionState := True;
  WebServer.SessionTimeOut := 30000;
  WebServer.AutoStartSession := True;
  WebServer.OnCommandGet := CustomOnCommandGet;

在 CustomOnCommandGet 中,我正在检查 TIdHTTPResponseInfo 的 CloseConnection 属性并将其设置为

  if LowerCase(ARequestInfo.Connection) = 'keep-alive' then begin
    AResponseInfo.CloseConnection := False;
  end
  else begin
    AResponseInfo.CloseConnection := True;
  end;

这是否足以满足设置 keepalive 的要求,或者我必须在 SetKeepAliveValues 中强制设置超时,指导我设置相同的任何其他指针都会非常有帮助

谢谢,

【问题讨论】:

【参考方案1】:

TIdHTTPServer 已经为您管理了 AResponseInfo.CloseConnection 属性。如果要允许HTTP keepalives,只需将TIdHTTPServer.KeepAlive属性设置为true,然后服务器将分析客户端请求以确定是否正在请求keepalives,从而决定是否关闭套接字发送响应后连接。如果TIdHTTPServer.KeepAlive 为假,则所有连接始终关闭。当使用 HTTP keepalives 时,客户端可以通过同一个套接字连接发送多个请求,从而提高网络性能。在 HTTP 0.9 中,不存在保活。在 HTTP 1.0 中,默认情况下它们是关闭的,必须明确请求它们。在 HTTP 1.1 中,它们默认开启,必须明确禁用。

SetKeepAliveValues() 处理的是 TCP keepalives。当活动的套接字连接处于空闲状态时(例如,当 HTTP 客户端请求 HTTP keepalive 并且尚未发送新请求时),TCP 本身会定期在后台发送少量心跳数据包以确保两个同伴都还活着并且反应灵敏。应用程序看不到这些数据包,它们由操作系统处理。 SetKeepAliveValues() 允许您指定空闲连接在发送心跳之前等待多长时间,以及心跳之间的间隔(默认值通常很大)。如果心跳失败,操作系统会关闭连接。

会话与保活无关。 Session 仅仅是一种在请求之间持久化数据的机制。会话仅存在于应用程序内存中,并且有自己的超时时间,因此可以在一段时间不使用时进行清理。创建新会话时,会为其分配一个唯一 ID,该 ID 在 HTTP cookie 中发送给客户端。如果会话仍然存在,则后续请求可以包含该 cookie 以检索会话。这允许OnCommand... 事件通过ARequestInfo.SessionAResponseInfo.Session 属性访问持久数据。

【讨论】:

在负载较重的网络服务器中实现keepalive是否可以降低cpu利用率,而不是不实现它? @RemyLebeau - 这是题外话:但通常单个连接会消耗多少内存?

以上是关于使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时的主要内容,如果未能解决你的问题,请参考以下文章

Indy 10.5.8 for Delphi and Lazarus 修改版(2011)

INDY 10.1.5 - 哪些 SSL dll 适用于 Delphi 2006?

Delphi组件indy 10中IdTCPServer修正及SSL使用心得

使用 TLS 使用来自 DELPHI(Indy) 的 Gmail 传出 SMTP

delphi idhttp 实战用法(TIdhttpEx)

delphi indy10 无法接收中文