2017-02-15 1 views
0

나는 TCP 클라이언트 - 서버 애플리케이션을 개발 중이다.TIdTCPServer에서 압축 된 데이터 크기를 얻는 방법?

저는 압축되지 않은 데이터 크기와 크기를 비교하고 얻은 압축 비율에 대한 통계를 얻을 수 있도록 클라이언트에 보내는 패킷의 압축 된 크기를 가져 오려고합니다.

클라이언트 측. OnSend/OnReceive 이벤트에서 얻은 크기와 송수신 된 데이터의 크기를 비교하는 정보를 TIdCompressionIntercept으로 가져올 수 있습니다. 해당 이벤트 핸들러의 ABuffer 매개 변수의 길이 만 가져 오면됩니다.

그러나 서버 측에서는 TIdServerCompressionIntercept에 연결할 이벤트가 없습니다.

그래서 질문입니다. 서버에서 보내거나받는 패킷의 압축 된 크기를 얻으려면 어떻게해야합니까? 그 크기를 해당 패킷의 원시 데이터 크기와 비교할 수 있습니까?

감사합니다.

클라이언트 측 코드 샘플 :이 이벤트가 없습니다 그 이유는 그래서


var 
    FRawSentSize   , 
    FComrpessedSentSize  , 
    FRawReceivedSize  , 
    FCompressedReceivedSize : UInt64; 

function TFrom1.SendAndReceive(const ToSend: String): String; 
begin 
    TCPClient.IOHandler.WriteLn(ToSend); 
    Inc(FRawSentSize, Length(ToSend)); 
    Result := TCPClient.IOHandler.ReadLn; 
    Inc(FRawReceivedSize, Length(Result)); 
end; 

function TForm1.CompressorSend(ASender: TIdConnectionIntercept; var ABuffer: TIdBytes); 
begin 
    Inc(FComrpessedSentSize, Length(ABuffer)); 
end; 

function TForm1.CompressorReceive(ASender: TIdConnectionIntercept; var ABuffer: TIdBytes); 
begin 
    Inc(FCompressedReceivedSize, Length(ABuffer)); 
end; 

답변

0

TIdServerCompressionIntercept는 실제 작업을 수행하는 절편이 아니다.

새 클라이언트가 서버에 연결되면 TIdServerCompressionInterceptAContext.Connection.IOHandler.Intercept 속성에 할당 된 TIdCompressionIntercept 개체를 만듭니다. 이 객체는 클라이언트 측 코드 에서처럼 실제 작업을 수행합니다. 서버의 OnConnect 또는 OnExecute 이벤트 처리기는 필요에 따라 해당 개체의 이벤트에 프로그래밍 방식으로 처리기를 할당 할 수 있습니다.

+0

이제 해결책이되었습니다. 고맙다 Gambit! – Avatar

관련 문제