java网络流量测量工具_使用Indy测量网络流量

我正在使用TIdTCPCmdServer来处理与客户端应用程序的所有通信。 我希望我的服务器记录所有类型的东西,包括网络流量。 有没有简单或聪明的方法来查看TCPCmdServer实际收到和发送了多少字节? 我只能想到代码

ASender.SendReply;

Inc (FTraffic, Sizeof (ASender.NormalReply.Code) +

Sizeof (Char) * ASender.NormalReply.Text.Length));

这在我看来非常难看,因为这些流量更新会在我的代码中传播,并且相当复杂。

有什么建议?

谢谢你的帮助。

#1楼

将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楼

查看Indy的拦截类。 您应该能够创建一个自定义拦截类来覆盖Receive()和Send()方法,并且除了调用基类的方法之外,还可以实现流量计算。 已经有拦截类来进行日志记录,您可以以相同的方式连接自定义类。

TIdConnectionIntercept的文档应该是一个很好的起点。 还有一个很简单的例子, 在这里就如何创建并在运行时连接拦截。

#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)标志? 当我尝试输入时,我总是得到一个块引用...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值