Мне нужно отслеживать подключения отдельных клиентов (записывать, читать байты и скорость (байт в секунду)) в моем простом приложении net-net netty. Как я понимаю, для этого мне нужно использовать ChannelTrafficShapingHandler
. Какие методы должны быть преодолены и как я могу выполнять эти вычисления?Расчет записанных и прочитанных байтов в netty-приложении
Мои ChannelInitializer:
public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("codec", new HttpServerCodec())
.addLast("traffic", new TrafficShapingHandler(AbstractTrafficShapingHandler.DEFAULT_CHECK_INTERVAL))
.addLast("handler", new HttpServerHandler());
}
}
Мой SimpleChannelInboundHandler:
public class HttpServerHandler extends SimpleChannelInboundHandler<HttpRequest> {
private static DefaultChannelGroup activeChannels = new DefaultChannelGroup("netty-receiver", ImmediateEventExecutor.INSTANCE);
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
activeChannels.add(ctx.channel());
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
ctx.flush();
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, HttpRequest req) throws Exception {
if (is100ContinueExpected(req)) {
ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
}
String uri = req.getUri().toLowerCase();
Controller controller = ControllerFactory.getController(uri);
FullHttpResponse response = controller.getResponse();
if (controller instanceof HelloController) {
ctx.executor().schedule(() -> ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE), 3, TimeUnit.SECONDS);
} else {
ctx.write(response).addListener(ChannelFutureListener.CLOSE);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
public static long getConnectionsQuantity() {
return activeChannels.size();
}
}
Это немного широк. Не могли бы вы добавить некоторые конкретные примеры кода, который вы пробовали, и что не работает/что пошло не так? –
@Topher обновил мое исходное сообщение, добавил код. Теперь я должен реализовать TrafficShapingHandler, чтобы писать, читать байты и скорость (байт в секунду), но не знаю, как это сделать правильно – TMS