如何在 Netty 4+ 中使用 ChannelTrafficShapingHandler?

高鸿武*_*高鸿武 3 rate-limiting netty

我需要向客户端推送一个大文件,但我想限制速度(例如100Kb/s),如何使用ChannelTrafficShapingHandler?

ServerBootstrap b = new ServerBootstrap();
              b.group(bossGroup, workerGroup)
               .channel(NioServerSocketChannel.class)
               .option(ChannelOption.SO_BACKLOG, 100)
               .handler(new LoggingHandler(LogLevel.INFO))
               .childHandler(new ChannelInitializer<SocketChannel>() {
                   @Override
                   public void initChannel(SocketChannel ch) throws Exception {
                       ChannelPipeline p = ch.pipeline();

                       p.addLast(
                               new StringEncoder(CharsetUtil.UTF_8),
                               new LineBasedFrameDecoder(8192),
                               new StringDecoder(CharsetUtil.UTF_8),
                               new ChannelTrafficShapingHandler(1,1,10L),
                               new ChunkedWriteHandler(),
                               new FileServerHandler()
                               );
                   }
               });
Run Code Online (Sandbox Code Playgroud)

这个演示不起作用,为什么?

Fre*_*ier 6

您是否在 FileServerHandler 中管理了通道写入功能?

正如 Netty API for ChannelTrafficShapingHandler 中所述

在您的处理程序中,您应该考虑使用 channel.isWritable() 和 channelWritabilityChanged(ctx) 来处理可写性,或通过 future.addListener(new GenericFutureListener()) 对 ctx.write() 返回的未来进行处理。

您还应该考虑在读取或写入操作中使对象大小相对适应您所需的带宽:例如,10 KB/s 的 10 MB 对象会导致突发效应,而 1 MB/s 的 100 KB 对象应该是平滑的由这个 TrafficShaping 处理程序处理。

和初始化:

  • 第一项是以 B/s 为单位的写入限制(这里强烈不推荐使用 1,接近 1024 是最小的,对于 1KB/s)
  • 第二项是 B/S 中的读取限制(这里强烈不推荐 1,接近 1024 是最小的,对于 1KB/s,或 0 表示没有限制)
  • 第一项是以毫秒为单位的间隔检查(这里 1L 表示每毫秒,强烈不推荐,接近 1000 的东西是最小的,每 1 秒)

您可以在此处查看示例(使用 Discard 示例),特别是: