【发布时间】:2012-01-09 03:37:57
【问题描述】:
我开发了一个使用 idHttpServer 的 Web 服务器和一个使用 idHTTP 的客户端应用程序。
我正在使用 Delphi 2010 和来自 trunk 的最新 indy svn 源代码。
此应用程序循环向 Web 服务器发送大约 1000 个请求。由于TIME_WAITS 和连接到网络服务器的开销,我需要使用keep-alive。问题是:在向服务器发出大约 700 个请求后,我的应用程序(客户端)在向网络服务器发布数据时挂起近 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;
我做得对吗?什么可能导致客户端应用程序冻结并且不完成发布请求?
我尝试在客户端冻结时调试服务器,但 OnClientReadmethod 没有被触发。在我看来,客户端在尝试连接 Web 服务器时遇到问题。
如果我将客户端代码修改为:
oIndyHttpClient.ProtocolVersion := pv1_0;
oIndyHttpClient.Request.Connection := 'close';
客户端应用程序没有冻结,一切正常。
在向服务器发送请求之前我应该清除IOHandler.InputBuffer 吗?我还有什么需要做的吗?
谢谢
【问题讨论】:
标签: delphi sockets delphi-2010 indy