2017-02-15 2 views
0

Je développe une application TCP Client-Serveur. J'essaie d'obtenir la taille compressée des paquets que j'envoie au client afin que je puisse comparer cette taille avec la taille de données non compressée et obtenir des statistiques sur le taux de compression obtenu.Comment obtenir la taille des données compressées à partir d'un TIdTCPServer?

Du côté client. Je peux obtenir cette information en comparant la taille des données envoyées/reçues avec la taille que je reçois des événements OnSend/OnReceive de TIdCompressionIntercept. Obtenir simplement la longueur du paramètre ABuffer de ces gestionnaires d'événements. Mais, côté serveur, le TIdServerCompressionIntercept n'a pas ces événements à accrocher.

Donc la question. Comment puis-je obtenir la taille compressée des paquets envoyés/reçus par le serveur, donc je peux comparer ces tailles avec la taille des données brutes de ces paquets?

Merci.

exemple de code côté client:


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; 

Répondre

0

TIdServerCompressionIntercept n'est pas l'interception qui fait le travail réel, c'est pourquoi il n'a pas d'événements. Lorsqu'un nouveau client se connecte au serveur, TIdServerCompressionIntercept crée un objet TIdCompressionIntercept affecté à la propriété AContext.Connection.IOHandler.Intercept. Cet objet fait le travail réel, tout comme dans le code côté client. Le gestionnaire d'événements OnConnect ou OnExecute de votre serveur peut assigner de manière programmée des gestionnaires aux événements de cet objet selon les besoins.

+0

Maintenant c'est une solution! Merci beaucoup Gambit! – Avatar