Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:设置TIdHttpServer的连接超时_Delphi_Indy_Idhttp - Fatal编程技术网

Delphi:设置TIdHttpServer的连接超时

Delphi:设置TIdHttpServer的连接超时,delphi,indy,idhttp,Delphi,Indy,Idhttp,使用TIdHTTPServer(Indy 10.6),我希望为关闭慢速或非活动客户端(客户端是公共浏览器)设置连接超时,并在60秒不活动后关闭所有僵尸连接。我在TIdContext.Connection中找到了Socket.ReadTimeout。这条路对吗?TIdHTTPServer已执行此操作(似乎有无限超时) 您的做法是正确的,ReadTimeout属性可用于断开未及时发送请求的慢速/死机客户端的连接。但是,您在错误的位置设置了ReadTimeout 触发OnCommand…事件时,TId

使用TIdHTTPServer(Indy 10.6),我希望为关闭慢速或非活动客户端(客户端是公共浏览器)设置连接超时,并在60秒不活动后关闭所有僵尸连接。我在TIdContext.Connection中找到了Socket.ReadTimeout。这条路对吗?TIdHTTPServer已执行此操作(似乎有无限超时)


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

触发
OnCommand…
事件时,
TIdHTTPServer
已完全读取客户端的请求,因此新设置将在同一连接上的下一个请求(如果有)之前生效。因此,您应该在
OnConnect
事件中设置
ReadTimeout
值:

WebServer.OnConnect := CustomOnConnect;

procedure CustomOnConnect(AContext: TIdContext);
begin
  AContext.Connection.Socket.ReadTimeout := 60000;
end;
记住HTTP是无状态的。只有使用HTTP keep alives(可选),才能在同一连接上发送多个HTTP请求。如果没有keep alives,服务器将在发送响应后关闭连接。客户端必须重新连接才能发送新请求


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

好的,谢谢!但是,为什么您删除了答案的部分?
[…],因此您的ReadTimeout值只能避免那些无法及时发送请求的缓慢/死机客户端。
。你认为,在我的例子中,“读取超时”对关闭死机/慢速连接没有用处吗?我删除了这个短语,因为在我进行编辑时,它已经不符合答案其余部分的流程。不过,它仍然适用,所以我把它放了回去。
WebServer.OnConnect := CustomOnConnect;

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