我正在使用TIdTCPCmdServer来处理与客户端应用程序的所有通信。我希望我的服务器记录所有类型的东西,包括网络流量。有没有简单或聪明的方法来查看TCPCmdServer实际收到和发送了多少字节?我只能想到像
这样的代码ASender.SendReply;
Inc (FTraffic, Sizeof (ASender.NormalReply.Code) +
Sizeof (Char) * ASender.NormalReply.Text.Length));
在我看来非常难看,因为这些流量更新会在我的代码中传播,并且相当复杂。
有什么建议吗?
感谢您的帮助。
答案 0 :(得分:7)
查看Indy的拦截类。您应该能够创建一个自定义拦截类来覆盖Receive()和Send()方法,并且除了调用基类的方法之外,还可以实现流量计算。已经有拦截类来进行日志记录,您可以以相同的方式连接自定义类。
TIdConnectionIntercept的文档应该是一个很好的起点。关于如何在运行时创建和连接拦截,还有一个非常简单的示例here。
答案 1 :(得分:4)
将TCPCmdServer
换行到记录流量的类中。
您可以从TCPCmdServer派生您的类,并覆盖发送和接收方法(如果它们是虚拟的)。
类似的东西:
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并公开所需方法和属性的新类。
答案 2 :(得分:3)
非常感谢你的回答。我选择以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)标志?当我尝试输入时,我总是得到一个块引用...