【问题标题】:How to get the compressed data size from a TIdTCPServer?如何从 TIdTCPServer 获取压缩数据大小?
【发布时间】:2017-02-15 14:50:17
【问题描述】:

我正在开发一个 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;

【问题讨论】:

    标签: indy10 delphi-10-seattle


    【解决方案1】:

    TIdServerCompressionIntercept 不是执行实际工作的拦截,因此它没有事件。

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

    【讨论】:

    • 现在这是一个解决方案!非常感谢 Gambit!
    猜你喜欢
    • 2011-01-07
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2019-08-13
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多