使用indy 10.5.8在Delphi 2010中设置KeepAlive Timeout

时间:2014-08-06 14:35:45

标签: delphi keep-alive indy10

我正在使用Delphi 2010和Indy 10.5.8

我试图了解我们如何使用keepalive功能。我遇到了一个方法SetKeepAliveValues,我们明确设置了保持活动超时时间&还发现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 个答案:

答案 0 :(得分:2)

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

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

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