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

时间:2017-02-15 14:50:18

标签: indy10 delphi-10-seattle

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

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

在客户端。我可以获得该信息,将发送/接收数据的大小与我从TIdCompressionIntercept的OnSend / OnReceive事件中获得的大小进行比较。只需获取这些事件处理程序的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;

1 个答案:

答案 0 :(得分:0)

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

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