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