如何从 TIdTCPServer 获取压缩后的数据大小?

How to get the compressed data size from a TIdTCPServer?

我正在开发 TCP 客户端-服务器应用程序。

我正在尝试获取我发送给客户端的数据包的压缩大小,以便我可以将该大小与未压缩的数据大小进行比较,并获得有关所获得的压缩率的统计信息。

在客户端。将 sent/received 数据的大小与我从 TIdCompressionIntercept 的 OnSend/OnReceive 事件中获得的大小进行比较,我可以获得该信息。只是获取那些事件处理程序的 ABuffer 参数的长度。

但是,在服务器端,TIdServerCompressionIntercept 没有要挂接的那些事件。

所以问题。我怎样才能通过服务器获得数据包的压缩大小sent/received,以便我可以将这些大小与这些数据包的原始数据大小进行比较?

谢谢。

客户端代码示例:


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;

TIdServerCompressionIntercept 不是执行实际工作的拦截,所以这就是它没有事件的原因。

当新客户端连接到服务器时,TIdServerCompressionIntercept 将创建一个 TIdCompressionIntercept 对象,该对象分配给 AContext.Connection.IOHandler.Intercept 属性。该对象执行实际工作,就像在 client-side 代码中一样。您的服务器的 OnConnectOnExecute 事件处理程序可以根据需要以编程方式将处理程序分配给该对象的事件。