Java,Netty:帮助理解ChannelPipelines和addLast

时间:2014-10-07 18:29:58

标签: java netty

我正在使用Netty io服务器some examples。我正在努力理解管道构造,以及添加到管道的元素如何相互影响,以及它们的顺序在管道中的重要性。到目前为止,我已经在我的main方法

中创建了一个子处理程序,如下所示
serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {   
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline().addLast( ... );
    }
}

我希望有一个管道,其中一个处理程序使用System.currentTimeMillis()生成一个long,另一个处理程序将其编码为DatetoString方法提供的格式的字符串。为此,我从这开始:

ChannelPipeline pipeline = socketChannel.pipeline().addLast(
    new ChannelInboundHandlerAdapter() {
        @Override
        public void channelActive(final ChannelHandlerContext channelHandlerContext) {
            byte[] bytes = "Press return to get the time\n".getBytes();
            channelHandlerContext.writeAndFlush(
                channelHandlerContext
                    .alloc()
                    .buffer(bytes.length)
                    .writeBytes(bytes));
        }
        @Override
        public void channelRead(final ChannelHandlerContext channelHandlerContext, Object object) {
            try {
                ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(
                    channelHandlerContext
                        .alloc()
                        .buffer()
                        .writeLong(System.currentTimeMillis()));
                channelFuture.addListener(ChannelFutureListener.CLOSE);
            } finally {
                ReferenceCountUtil.release(object);
            }
        }
        @Override
        public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) {
            throwable.printStackTrace();
            channelHandlerContext.close();
        }
    }
);

如何修改此编码器,以便编码器将有效负载编码为日期字符串,例如2014-10-07T18:34:10.897-00:00?这是考虑管道的正确方法,虽然这是一个微不足道的例子吗?

在理解方面,looking at this example,目前尚不清楚该管道的顺序是如何执行的。例如,如果我假设它们以线性顺序执行,我会将某些数据有效负载进行gzip压缩然后立即解压缩。我错过了什么?

    pipeline.addLast(ZlibCodecFactory.newZlibEncoder(ZlibWrapper.GZIP));
    pipeline.addLast(ZlibCodecFactory.newZlibDecoder(ZlibWrapper.GZIP));

    // Add the number codec first,
    pipeline.addLast(new BigIntegerDecoder());
    pipeline.addLast(new NumberEncoder());

    // and then business logic.
    // Please note we create a handler for every new channel
    // because it has stateful properties.
    pipeline.addLast(new FactorialServerHandler());

更新:我找到this diagram但我仍在尝试解决如何将上述示例中的长期强制转换回返回客户端的日期。我该怎么做?

0 个答案:

没有答案