Indy idHttp冻结 - 如何使用keep-alive?

Raf*_*cci 5 sockets delphi indy delphi-2010

我开发了一个使用的Web服务器idHttpServer和一个使用的客户端应用程序idHTTP.

我正在使用Delphi 2010和来自trunk的最新indy svn源代码.

此应用程序在循环中向Web服务器发送大约1000个请求.由于TIME_WAITS和连接到网络服务器的开销,我需要使用keep-alive.问题是:在向服务器发出大约700个请求之后,我的应用程序(客户端)在将数据发布到Web服务器时几乎持续了10分钟(几乎每次都会发生).

所以,我需要知道如何正确使用indy来保持活着.

到目前为止,我有这个代码:

在客户端:

oIndyHttpClient := TIdHTTP.Create(nil);
oIndyHttpClient.ProxyParams.Clear;
oIndyHttpClient.Request.CacheControl := 'no-cache';
oIndyHttpClient.ProtocolVersion := pv1_1;
oIndyHttpClient.HTTPOptions := oIndyHttpClient.HTTPOptions + [hoKeepOrigProtocol];
oIndyHttpClient.ReuseSocket := rsOSDependent;
oIndyHttpClient.Request.Connection := 'keep-alive';
Run Code Online (Sandbox Code Playgroud)

在服务器端:

oIdHttpServer.OnCommandGet := Self.OnClientRead;
oIdHttpServer.AutoStartSession := False;
oIdHttpServer.KeepAlive := False;

procedure TPLKWSServerSocketIndy.OnClientRead(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  //do some stuff here
  if LowerCase(ARequestInfo.Connection) = 'keep-alive' then begin
    AResponseInfo.CloseConnection := False;
  end
  else begin
    AResponseInfo.CloseConnection := True;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我做得对吗?什么可能导致客户端应用程序冻结并且不完成发布请求?

我尝试在客户端冻结时调试服务器,但该OnClientRead方法不会被触发.在我看来,客户端在尝试连接Web服务器时遇到问题.

如果我将客户端代码修改为:

oIndyHttpClient.ProtocolVersion := pv1_0;
oIndyHttpClient.Request.Connection := 'close';
Run Code Online (Sandbox Code Playgroud)

客户端应用程序不会冻结,一切都很好.

我应该IOHandler.InputBuffer在向服务器发送请求之前清除吗?还有什么我需要做的吗?

谢谢

Rem*_*eau 9

您无需在服务器端手动管理保持活动. TIdHTTPServer为你处理.只需将该TIdHTTPServer.KeepAlive属性设置为True(默认情况下为False,并且您的代码无论如何都将其设置为False)并且根本不设置该AResponseInfo.CloseConnection属性.TIdHTTPServer在触发OnCommandGet事件之前,根据每个请求决定将其设置为什么值.