我开发了一个使用idHttpServer的and服务器和一个使用idHTTP的客户端应用程序。
我使用的是Delphi2010和主干上最新的indy svn源代码。
这个应用程序在一个循环中向Web服务器发送大约1000个请求。由于TIME_WAITS和连接到and服务器的开销,我需要使用keep-alive。问题是:在向服务器发出大约700个请求后,我的应用程序(客户端)在将数据发送到when服务器时挂起了近10分钟(几乎每次都会发生)。
因此,我需要知道如何在indy中正确使用keep-alive。
到目前为止,我有以下代码:
在客户端:
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';在服务器端:
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;我做得对吗?是什么原因导致客户端应用程序冻结并且无法完成post请求?
我尝试在客户端冻结时调试服务器,但OnClientRead方法没有触发。在我看来,客户端在尝试连接do web服务器时遇到了问题。
如果我将客户端代码修改为:
oIndyHttpClient.ProtocolVersion := pv1_0;
oIndyHttpClient.Request.Connection := 'close';客户端应用程序不会冻结,一切都很好。
我应该在向服务器发送请求之前清除IOHandler.InputBuffer吗?还有什么我需要做的吗?
谢谢
发布于 2011-11-30 04:13:54
您无需在服务器端手动管理keep-alives。TIdHTTPServer会帮你处理这件事。只需将TIdHTTPServer.KeepAlive属性设置为True (默认情况下为False,您的代码也会将其设置为False ),而根本不设置AResponseInfo.CloseConnection属性。在触发OnCommandGet事件之前,TIdHTTPServer会根据每个请求决定要将其设置为什么值。
https://stackoverflow.com/questions/8316837
复制相似问题