我是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));
}
就像向处理程序添加类一样,但我该如何使用它呢?
我写了帖子(Netty http count requests)并被建议编写我自己的处理程序来计算我的请求,打开连接等。但是,我无法理解如何使用不同的处理程序管理不同的URL。例如,我有url / info - 这是okey,我想在Handler#1中处理它。然后,我有url / statistic,我想在那里计算我的值并打印它们。此网址应由Handler#2管理。我怎么能这样做?
我有很多数据应该在页面上输出(比如几个表格),我该怎么用呢?我认为该字符串不适合大输出
感谢您的耐心和答案
答案 0 :(得分:1)
首先,在管道上添加HttpObjectAggregator
处理程序。它将为您处理所有http chuncks并将FullHttpRequest
置于管道上。
然后,实现扩展SimpleChannelInboundHandler<FullHttpRequest>
的处理程序并将其添加到管道的末尾。在FullHttpRequest
捕获到此处理程序中,您可以获取标题,请求的URI,内容等方法。您可以根据需要将内容数据大小存储到地图或其他地方,按请求的路径等。实现您需要的一切
对于响应,如果使用http / html,则使用文本(因此字符串)。实例化DefaultFullHttpResponse
的实例,并将您的html文本作为此响应的内容。接下来,您只需通过调用ctx.writeAndFlush()
将其推送到管道上(HttpResponseEncoder
会将消息转换为有效的http响应)。
此外,您可以选择在管道上添加HttpContentCompressor
以在可能的情况下激活压缩。