我正在使用TIdTCPCmdServer來處理與客戶端應用程序的全部通訊。 我但願個人服務器記錄全部類型的東西,包括網絡流量。 有沒有簡單或聰明的方法來查看TCPCmdServer實際收到和發送了多少字節? 我只能想到代碼 html
ASender.SendReply; Inc (FTraffic, Sizeof (ASender.NormalReply.Code) + Sizeof (Char) * ASender.NormalReply.Text.Length));
這在我看來很是難看,由於這些流量更新會在個人代碼中傳播,而且至關複雜。 服務器
有什麼建議? 網絡
謝謝你的幫助。 ide
將TCPCmdServer
包裝到記錄流量的類中。 spa
您能夠從TCPCmdServer派生您的類,並覆蓋發送和接收方法(若是它們是虛擬的)。 日誌
就像是: code
type TTcpCmdServerWithLogging = class(TTcpCmdServer) ... procedure SendReply; override; implementation procedure SendReply; begin inherited SendReply; Inc (FTraffic, Sizeof (NormalReply.Code) + Sizeof (Char) * NormalReply.Text.Length)); end;
若是它們不是虛擬的,則建立實例化TCPCmdServer並公開所需方法和屬性的新類。 orm
查看Indy的攔截類。 您應該可以建立一個自定義攔截類來覆蓋Receive()和Send()方法,而且除了調用基類的方法以外,還能夠實現流量計算。 已經有攔截類來進行日誌記錄,您能夠以相同的方式鏈接自定義類。 htm
TIdConnectionIntercept的文檔應該是一個很好的起點。 還有一個很簡單的例子, 在這裏就如何建立並在運行時鏈接攔截。 文檔
很是感謝你的回答。 我選擇以mghie描述的方式實現它 - 經過爲個人鏈接實現自定義攔截器類。 對於那些對解決方案感興趣的人,我將在這裏提供一些源代碼:
type TCountTrafficInterceptor = class (TIdConnectionIntercept) public type TIntPointer = ^Longint; private FTraffic : TIntPointer; public constructor Create (TrafficVar : TIntPointer); procedure Send (var ABuffer : TIdBytes); override; procedure Receive (var ABuffer : TIdBytes); override; end; constructor TCountTrafficInterceptor.Create (TrafficVar : TIntPointer); begin FTraffic := TrafficVar; end; procedure TCountTrafficInterceptor.Send (var ABuffer : TIdBytes); begin inherited Send (ABuffer); FTraffic^ := FTraffic^ + Length (ABuffer); end; procedure TCountTrafficInterceptor.Receive (var ABuffer : TIdBytes); begin inherited Receive (ABuffer); FTraffic^ := FTraffic^ + Length (ABuffer); end;
在TIdTCPCmdServer的OnConnect方法中:
AContext.Connection.IOHandler.Intercept := TCountTrafficInterceptor.Create (@FNetworkTraffic);
效果很好,只是我正在尋找的那種解決方案。 再次感謝您的回答。
順便說一句:我如何在帖子中使用(at)標誌? 當我嘗試輸入時,我老是獲得一個塊引用...