我使用的是 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.Session
和 AResponseInfo.Session
属性访问持久数据。
关于delphi - 在 Delphi 2010 和 indy 10.5.8 中设置 KeepAlive 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163195/