2011-11-29 5 views
4

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을 삭제해야합니까? 내가해야 할 일이 더 있니?

감사합니다.

답변

7

서버 측에서 수동으로 연결 유지를 관리 할 필요가 없습니다. TIdHTTPServer에서 처리합니다. TIdHTTPServer.KeepAlive 속성을 True로 설정하면 (기본값은 False이고 코드는 False로 설정 함) AResponseInfo.CloseConnection 속성을 전혀 설정하지 마십시오. TIdHTTPServer는 OnCommandGet 이벤트를 시작하기 전에 요청별로 요청할 값을 결정합니다.

+0

OK, 클라이언트 코드는 괜찮습니까? 내가 제대로하고 있니? 왜 요청이 멈추는 지 아십니까? 서버 코드에 대한 실수로 인해 요청이 지연되고 있습니까? –

+0

클라이언트 코드가 괜찮습니다 (ReuseSocket' 속성을 사용하지 않아도됩니다). 교수형이 실제로 발생하는 곳을 찾으려면 TIdHTTP의 내부 코드를 디버깅해야합니다. 정지가 발생할 때 서버가 실제로 클라이언트에 데이터를 다시 보내고 있는지 확인하기 위해 패킷 스니퍼를 실행해야합니다. –

+0

나는이 권리가 있는지 확실하지 않습니다. 서버가 언제든지 데이터를 클라이언트로 다시 보냅니 까? 나는 이런 일이 일어나는 것을 결코 보지 못했다. –