Netty:几个处理程序,字节计数器

Netty: several handlers, byte counter

  1. 我是 Netty 的新手,正在尝试计算每个通道接收和发送的字节数。我发现我应该为此使用 ChannelTrafficShapingHandler 但我不知道如何实现我的目标。正如我所理解的那样,我应该编写自己的处理程序,它会通过添加一些方法从 ChannelTrafficShapingHandler 中提取出来?最好能提供真实的代码示例。

    @Override
    public void initChannel(SocketChannel ch) {
    ChannelPipeline p = ch.pipeline();
    if (sslCtx != null) {
        p.addLast(sslCtx.newHandler(ch.alloc()));
    }
    p.addLast(new HttpRequestDecoder());
    // Uncomment the following line if you don't want to handle HttpChunks.
    //p.addLast(new HttpObjectAggregator(1048576));
    p.addLast(new HttpResponseEncoder());
    // Remove the following line if you don't want automatic content compression.
    //p.addLast(new HttpContentCompressor());
    p.addLast(new HttpSnoopServerHandler());
    
    p.addLast(new ChannelTrafficShapingHandler(0, 0));
    

    }

喜欢将 class 添加到处理程序,但我该如何使用它?

  1. 我写了 post () 并被建议编写我自己的处理程序来计算我的请求、打开的连接等。但是,我不明白如何使用不同的处理程序管理不同的 url。例如,我有 url /info - 没关系,我想在 Handler #1 中处理它。然后,我有 url /statistic 并且我想在那里计算我的值并打印它们。此 url 应由处理程序 #2 管理。我该怎么做?

  2. 我有很多数据需要在页面上输出(比如几个表格),我应该用什么来做?我认为字符串不适合大输出

感谢您的耐心解答

首先,在管道上添加一个 HttpObjectAggregator 处理程序。它将为您处理所有的 http chuncks 并放入管道 a FullHttpRequest

然后,实现一个扩展 SimpleChannelInboundHandler<FullHttpRequest> 的处理程序并将其添加到管道的末尾。在捕获到此处理程序中的 FullHttpRequest 上,您可以使用方法获取 headers、请求的 URI、内容等。您可以根据需要将内容数据大小存储到地图或其他内容中,通过请求的路径等。实现你所需要的一切。

对于响应,如果使用 http/html,则使用文本(so 字符串)。实例化 DefaultFullHttpResponse 的实例,并将您的 html 文本作为此响应的内容。接下来,您只需通过调用 ctx.writeAndFlush() 将其推送到管道(HttpResponseEncoder 将为您将消息转换为有效的 http 响应)。

此外,您可以选择在管道上添加 HttpContentCompressor 以在可能的情况下激活压缩。