Метод ChannelRead не вызывается при выполнении запроса для сервера netty - PullRequest
0 голосов
/ 01 апреля 2019

Я реализую netty-сервер, который принимает http-запрос и выполняет некоторую бизнес-логику. В основном, я принимаю GET-запрос на localhost / hello и sysout uri is hello

при запуске сервера я не вижу никакихsysouts в методе CustomRequestHandler # channelRead0.Я держал отладчик включенным и вижу, что метод channelRead0 не вызывается.Я не могу понять, в чем проблема

Я использую Netty 4.1.30. Окончательная версия

public class HttpServer {

    public static void main( String[] args ) throws Exception {

        InetSocketAddress tcpSocketAddress = new InetSocketAddress(8080);

        System.out.println("Starting http server at " + tcpSocketAddress.getPort());
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {

        ServerBootstrap bootstrap = new ServerBootstrap()
                .group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .handler(new LoggingHandler(LogLevel.INFO))
                .childHandler(new MyChannelInitializer())
                .childOption(ChannelOption.AUTO_READ, false);


        ChannelFuture serverChannelFuture = bootstrap.bind(tcpSocketAddress).sync();
        System.out.println("open the browser");
        serverChannelFuture.channel().closeFuture().sync();
        } finally {
             bossGroup.shutdownGracefully();
             workerGroup.shutdownGracefully();
        }
    }
}


public class MyChannelIntializer extends ChannelInitializer<SocketChannel> {

    @Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline p = ch.pipeline();
        p.addLast(new LoggingHandler(LogLevel.INFO));
        //p.addLast(new HttpServerCodec());
        p.addLast(new HttpRequestDecoder());
        p.addLast(new HttpResponseEncoder());
        p.addLast(new CustomRequestHandler());
    }
}

public class CustomRequestHandler extends SimpleChannelInboundHandler<Object> {

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object httpObject) {
        System.out.println("hello world");
        if (httpObject instanceof HttpRequest) {
            HttpRequest request = (HttpRequest) httpObject;
            System.out.println("uri is " + request.getUri());
    }
}

1 Ответ

1 голос
/ 01 апреля 2019

Проблема в том, что вы используете:

                .childOption(ChannelOption.AUTO_READ, false);

Это означает, что как только канал будет принят, он не будет обрабатывать входящие данные, пока вы не вызовете ctx.read() каждый раз, когда захотите обработать больше входящих данных.

Таким образом, вы можете либо удалить эту строку, либо переопределить channelActive(...) в вашем CustomRequestHandler и позвонить туда ctx.read(). Это гарантирует, что вы попытаетесь прочитать некоторые входящие данные. Тем не менее, вам нужно будет позвонить ctx.read() еще раз, когда вы хотите обработать больше данных.

...