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在向服务器发送请求之前清除吗?还有什么我需要做的吗?
谢谢
您无需在服务器端手动管理保持活动. TIdHTTPServer为你处理.只需将该TIdHTTPServer.KeepAlive属性设置为True(默认情况下为False,并且您的代码无论如何都将其设置为False)并且根本不设置该AResponseInfo.CloseConnection属性.TIdHTTPServer在触发OnCommandGet事件之前,根据每个请求决定将其设置为什么值.
| 归档时间: |
|
| 查看次数: |
6241 次 |
| 最近记录: |