如何在 netty 中设置 TrafficCounter?

How to setup TrafficCounter in netty?

我正在编写一个需要跟踪 sent/received 字节和带宽的应用程序。我正在使用本身使用 Netty 5.0 的库。

我对 Netty 代码的唯一访问权限是扩展我正在使用的库的 class

如何在此 class 中创建和设置 TrafficCounter?我无法在网络上找到任何有关如何执行此操作的示例(至少在 Netty 5.0 中找不到)。我有多个使用 Netty 的线程,所以我需要每个通道的流量。

您可以查看此 PR,其中仍然包含有关如何使用 TrafficCounter(实际上是 TrafficShapingHandler)的完整示例:

https://github.com/fredericBregier/netty/tree/8f704e6020de364b031a77e1ee403d3ae4d8e10d/example/src/main/java/io/netty/example/discard

特别是 DiscardServer,它同时包含全局流量整形和渠道流量整形,其中最后一个 (ChannelTrafficShaping) 就是您要查找的那个。

那么你可能拥有的是:

        bootstrap.handler(new ChannelInitializer<Channel>() {
            @Override
            public void initChannel(Channel channel) throws Exception {
                getPacketProtocol().newClientSession(client, TcpClientSession.this);

                channel.config().setOption(ChannelOption.IP_TOS, 0x18);
                channel.config().setOption(ChannelOption.TCP_NODELAY, false);

                ChannelPipeline pipeline = channel.pipeline();

                refreshReadTimeoutHandler(channel);
                refreshWriteTimeoutHandler(channel);

                pipeline.addLast("encryption", new TcpPacketEncryptor(TcpClientSession.this));
                pipeline.addLast("traffic", new ChannelTrafficShapingHandler(0, MAXCHANNELTHROUGHPUT, 1000)); // ADDED
                pipeline.addLast("sizer", new TcpPacketSizer(TcpClientSession.this));
                pipeline.addLast("codec", new TcpPacketCodec(TcpClientSession.this));
                pipeline.addLast("manager", TcpClientSession.this);
            }
        }).group(this.group).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, getConnectTimeout() * 1000);

当然还要看看 API:Traffic and in particular ChannelTrafficShapingHandler