idHttpServer
을 사용하는 웹 서버와 idHTTP
을 사용하는 클라이언트 응용 프로그램을 개발했습니다.Indy idHttp freezes - Keep-Alive로 작업하는 방법?
저는 Delphi 2010과 최신 indy svn 소스를 트렁크에서 사용하고 있습니다.
이 응용 프로그램은 약 1000 회의 요청을 웹 서버에 반복 전송합니다. TIME_WAITS
과 웹 서버에 연결하는 오버 헤드 때문에 keep-alive
을 사용해야합니다. 문제는 서버에 약 700 건의 요청을 한 후 웹 서버에 데이터를 게시 할 때 (거의 매일 발생) 내 응용 프로그램 (클라이언트 측)이 거의 10 분 동안 중단된다는 것입니다.
그래서, 나는 인디에서 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
메서드가 실행되지 않습니다. 그것은 내게 클라이언트가 웹 서버에 연결하려고하는 데 문제가있는 것 같습니다.
I가 클라이언트 코드를 수정하는 경우 :
oIndyHttpClient.ProtocolVersion := pv1_0;
oIndyHttpClient.Request.Connection := 'close';
클라이언트 응용 프로그램이 정지하지 않고 모든 좋은 작동합니다.
서버에 요청을 보내기 전에 IOHandler.InputBuffer
을 삭제해야합니까? 내가해야 할 일이 더 있니?
감사합니다.
OK, 클라이언트 코드는 괜찮습니까? 내가 제대로하고 있니? 왜 요청이 멈추는 지 아십니까? 서버 코드에 대한 실수로 인해 요청이 지연되고 있습니까? –
클라이언트 코드가 괜찮습니다 (ReuseSocket' 속성을 사용하지 않아도됩니다). 교수형이 실제로 발생하는 곳을 찾으려면 TIdHTTP의 내부 코드를 디버깅해야합니다. 정지가 발생할 때 서버가 실제로 클라이언트에 데이터를 다시 보내고 있는지 확인하기 위해 패킷 스니퍼를 실행해야합니다. –
나는이 권리가 있는지 확실하지 않습니다. 서버가 언제든지 데이터를 클라이언트로 다시 보냅니 까? 나는 이런 일이 일어나는 것을 결코 보지 못했다. –