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

标签 delphi sockets delphi-2010 indy

我开发了一个使用 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/

相关文章:

c# - 如何从 telnet 或 SSH 访问 c# 套接字服务器?

delphi - Process32Next不同的结果

delphi - 将构建服务器从 Delphi XE 迁移到 Delphi XE2

delphi - 更改位图的色调但保留背景颜色?

c++ - 如何通过套接字发送 OpenCV Mat

delphi - 将图形栏添加到 StringGrid col

xml - 如何使 TXMLDocument(使用 MSXML 实现)始终包含编码属性?

c++ - 使用 GetProcAddress : callback function fails with invalid parameter 从 C++ 调用 Delphi DLL

Delphi非对称加密

c++ - 提升 asio 服务器客户端。连接局域网中的两台计算机