美文网首页
25.ByteToMessageDecoderReplaying

25.ByteToMessageDecoderReplaying

作者: 未知的证明 | 来源:发表于2019-03-24 23:34 被阅读0次

    ByteToMessageDecoderReplayingDecoder<Void>、MessageToByteEncoder<Long>、MessageToMessageDecoder<Long>

    1.Server端

    public class MyServer {
    
        public static void main(String[] args) throws Exception {
            EventLoopGroup bossGroup = new NioEventLoopGroup(1);
            EventLoopGroup workerGroup = new NioEventLoopGroup();
    
            try {
                ServerBootstrap serverBootstrap = new ServerBootstrap();
                serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).
                        childHandler(new MyServerInitializer());
    
                ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
                channelFuture.channel().closeFuture().sync();
            } finally {
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            }
        }
    }
    

    2.ServerInitializer

    public class MyServerInitializer extends ChannelInitializer<SocketChannel> {
    
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
    
            pipeline.addLast(new MyByteToLongDecoder2());
            pipeline.addLast(new MyLongToStringDecoder());
            pipeline.addLast(new MyLongToByteEncoder());
            pipeline.addLast(new MyServerHandler());
        }
    }
            
    

    3.Client端

    public class MyClient {
    
        public static void main(String[] args) throws Exception{
            EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
    
            try {
                Bootstrap bootstrap = new Bootstrap();
                bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class).
                        handler(new MyClientInitializer());
    
                ChannelFuture channelFuture = bootstrap.connect("localhost", 8899).sync();
                channelFuture.channel().closeFuture().sync();
            } finally {
                eventLoopGroup.shutdownGracefully();
            }
        }
    }
    

    4.Client端的ServerInitializer

    public class MyClientInitializer extends ChannelInitializer<SocketChannel> {
    
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
    
            pipeline.addLast(new MyByteToLongDecoder2());
            pipeline.addLast(new MyLongToByteEncoder());
            pipeline.addLast(new MyClientHandler());
        }
    }
    
    

    5.入站出站编码器解码器

    public class MyByteToLongDecoder2 extends ReplayingDecoder<Void> {
    
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
            System.out.println("MyByteToLongDecoder2 decode invoked!");
    
            out.add(in.readLong());
        }
    }
    
    public class MyLongToStringDecoder extends MessageToMessageDecoder<Long> {
    
        @Override
        protected void decode(ChannelHandlerContext ctx, Long msg, List<Object> out) throws Exception {
            System.out.println("MyLongToStringDecoder decode invoked!");
            out.add(String.valueOf(msg));
        }
    }
    
    public class MyLongToByteEncoder extends MessageToByteEncoder<Long>{
    
        @Override
        protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception {
            System.out.println("encode invoked!");
    
            System.out.println(msg);
    
            out.writeLong(msg);
        }
    }
    
    public class MyServerHandler extends SimpleChannelInboundHandler<String> {
    
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
            System.out.println(ctx.channel().remoteAddress() + ", " + msg);
    
            ctx.writeAndFlush(654321L);
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            cause.printStackTrace();
            ctx.close();
        }
    }
    

    有问题的编解码

    public class MyByteToLongDecoder extends ByteToMessageDecoder {
    
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
            System.out.println("decode invoked!");
    
            System.out.println(in.readableBytes());
    
            if (in.readableBytes() >= 8) {
                out.add(in.readLong());
            }
        }
    }
    
    
    public class MyLongToByteEncoder extends MessageToByteEncoder<Long>{
    
        @Override
        protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception {
            System.out.println("encode invoked!");
    
            System.out.println(msg);
    
            out.writeLong(msg);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:25.ByteToMessageDecoderReplaying

          本文链接:https://www.haomeiwen.com/subject/uvxmvqtx.html