gpt4 book ai didi

delphi - Indy idHttp 卡住 - 如何使用 keep-alive?

转载 作者:行者123 更新时间:2023-12-03 15:07:51 24 4
gpt4 key购买 nike

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

我使用的是 Delphi 2010 和来自 trunk 的最新 indy svn 源。

此应用程序循环发送大约 1000 个请求到 Web 服务器。由于 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;

我做得对吗?是什么导致客户端应用程序卡住并且无法完成发布请求?

我尝试在客户端卡住时调试服务器,但 OnClientRead 方法不会被触发。在我看来,客户端在尝试连接网络服务器时遇到问题。

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

oIndyHttpClient.ProtocolVersion := pv1_0;
oIndyHttpClient.Request.Connection := 'close';

客户端应用程序不会卡住,一切正常。

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

谢谢

最佳答案

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

关于delphi - Indy idHttp 卡住 - 如何使用 keep-alive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8316837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com