1

I'm new to Netty and have succeeded in creating a server that works over TLS. I'm now designing a second server but I'm having some issues with the pipeline. What I need is a dynamic pipeline like the port unification example from Netty: http://netty.io/4.0/xref/io/netty/example/portunification/PortUnificationServerHandler.html

Each connection starts with the client sending a UTF-8 encoded string. I can read this fine, but my reply isn't coming through. My reply is just a byte array of 3 bytes.

Here's my server:

// Configure the server
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    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 pipeline = ch.pipeline();
                    pipeline.addLast(new LineBasedFrameDecoder(192));
                    pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
                    pipeline.addLast(new ByteArrayEncoder());
                    pipeline.addLast(new TokenHandler());
                }
            });

    // Start the server
    ChannelFuture f = b.bind(port).sync();

    // Wait until the server socket is closed
    f.channel().closeFuture().sync();
}
finally {
    // Shut down all event loops to terminate all threads
    bossGroup.shutdownGracefully();
    workerGroup.shutdownGracefully();
}

And my TokenHandler, which is a SimpleChannelInboundHandler:

public class TokenHandler extends SimpleChannelInboundHandler<String> {
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String token) throws Exception {
        System.out.println("Token received: " + token);
        channelHandlerContext.writeAndFlush(new byte[] {2, 1, 0});
    }
}

I've also tried replacing that last line with

channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(new byte[] {2, 1, 0}));

and removing the ByteArrayEncoder from my pipeline, but this doesn't make any difference: no bytes are being sent. I can send strings just fine if I add a StringEncoder, and the Echo example from Netty also works (available from the user guide: http://netty.io/wiki/user-guide-for-4.x.html). I'm guessing it's a basic mistake being new to Netty, but I can't find other people with cases with a similar issue.

EDIT: I'm using Netty 4.0.34.Final

1 Answer 1

1

I should've read the docs more carefully. The solution was to add super(true) to the constructor of my TokenHandler because by default a SimpleChannelInboundHandler releases its messages after processing which stops the response from propagating further through the pipeline.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.