gpt4 book ai didi

Delphi:设置 TIdHttpServer 连接超时

转载 作者:行者123 更新时间:2023-12-02 07:34:14 27 4
gpt4 key购买 nike

使用 TIdHTTPServer (Indy 10.6),我想为关闭缓慢或不活动的客户端(客户端是常见浏览器)设置连接超时,并在 60 秒不活动后关闭所有僵尸连接。我在 TIdContext.Connection 中找到了 Socket.ReadTimeout。这是正确的方法吗? TIdHTTPServer 已经执行此操作(似乎有无限超时)?

WebServer := TIdHTTPServer.Create(nil);
WebServer.SessionState := false;
WebServer.KeepAlive := false;
WebServer.OnCommandGet := CustomOnCommandGet;

procedure CustomOnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo;
begin
AContext.Connection.Socket.ReadTimeout := 60000;
AResponseInfo.ContentStream := TFileStream.Create('C:/file.zip', fmOpenRead or fmShareCompat);
end;

最佳答案

您的思路是正确的,ReadTimeout 属性可用于断开未及时发送请求的慢速/死机客户端。但是,您在错误的位置设置了 ReadTimeout

当触发 OnCommand... 事件时,TIdHTTPServer 已经完整读取客户端的请求,因此您的新设置要等到<同一连接上的下一个请求(如果有)。因此,您应该在 OnConnect 事件中设置 ReadTimeout 值:

WebServer.OnConnect := CustomOnConnect;

procedure CustomOnConnect(AContext: TIdContext);
begin
AContext.Connection.Socket.ReadTimeout := 60000;
end;

请记住,HTTP 是无状态的。仅当使用 HTTP keep-alive 时(可选),才可以在同一个连接上发送多个 HTTP 请求。如果没有保持事件状态,服务器会在发送响应后关闭连接。客户端必须重新连接才能发送新请求。

您将服务器的 KeepAlive 属性设置为 false,因此不会遵守任何保持事件状态,每个请求后都会断开连接。因此,您需要在 OnConnect 事件中设置 ReadTimeout,以将其应用于每个连接上发送的唯一请求。但是,如果您启用 KeepAlive,并且客户端请求保持事件状态,则 ReadTimeout 将应用于客户端在同一连接上发送的每个请求,尤其是第一个请求.

关于Delphi:设置 TIdHttpServer 连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101959/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com