在Netty中读取字符串并回复字节

时间:2016-03-16 08:17:17

标签: java netty

我是Netty的新手,并成功创建了一个可以在TLS上运行的服务器。我现在正在设计第二台服务器,但我遇到了一些管道问题。我需要的是动态管道,如Netty的端口统一示例:http://netty.io/4.0/xref/io/netty/example/portunification/PortUnificationServerHandler.html

每个连接都以客户端发送UTF-8编码字符串开始。我可以读到这个很好,但我的回复没有通过。我的回复只是一个3字节的字节数组。

这是我的服务器:

// 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();
}

我的TokenHandler,它是一个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});
    }
}

我也尝试用

替换最后一行
channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(new byte[] {2, 1, 0}));

并从我的管道中删除ByteArrayEncoder,但这没有任何区别:没有发送字节。如果我添加一个StringEncoder,我可以发送字符串,并且Netty的Echo示例也可以使用(可从用户指南中获得:http://netty.io/wiki/user-guide-for-4.x.html)。我猜这是Netty新手的一个基本错误,但我找不到其他有类似问题的人。

编辑:我正在使用Netty 4.0.34.Final

1 个答案:

答案 0 :(得分:1)

我应该更仔细地阅读文档。解决方案是将super(true)添加到我的TokenHandler的构造函数中,因为默认情况下SimpleChannelInboundHandler在处理后释放其消息,这会阻止响应在管道中进一步传播。