delphi - 在 Delphi 2010 和 indy 10.5.8 中设置 KeepAlive 超时

标签 delphi keep-alive indy10

我使用的是 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 中强制设置超时,指导我设置相同的任何其他指针都会非常有帮助

谢谢

最佳答案

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

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

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

关于delphi - 在 Delphi 2010 和 indy 10.5.8 中设置 KeepAlive 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163195/

相关文章:

delphi - 如何在运行时在 FireMonkey 中使用鼠标选择 3D 对象

iis - 如何为IIS启用TCP keep Alive?

HTTP KeepAlive可以代替TCP KeepAlive吗?

delphi - DataSnap 将入站请求限制为 16k

rest - 在Delphi XE10.1中使用/解析curl

delphi - Indy IMAP 客户端的电子邮件到达通知 (Delphi 2009)

.net - 在 Delphi 中实现 .NET 接口(interface)

web-services - 如何找出我收到 EOSError 代码 5 - Access Denied 注册服务的原因?

delphi - 什么源控制系统?

php - 保持与 php 的实时连接?