zoukankan      html  css  js  c++  java
  • netty-编码解码器

    1.基本介绍

    • 当Netty发送或者接受一个消息的时候,就将会发生一次数据转换。入站消息会被解码:从字节转换为另一种格式(比如java对象);如果是出站消息,它会被编码成字节。
    • Netty提供一系列实用的编解码器,他们都实现了ChannelInboundHadnler或者ChannelOutboundHandler接口。在这些类中,channelRead方法已经被重写了。以入站为例,对于每个从入站Channel读取的消息,这个方法会被调用。随后,它将调用由解码器所提供的decode()方法进行解码,并将已经解码的字节转发给ChannelPipeline中的下一个ChannelInboundHandler。

    2.解码器-ByteToMessageDecoder

    实例分析

    public class ByteDeco extends ByteToMessageDecoder {
        /**
         *
         * decode 会根据接收的数据,被调用多次, 直到确定没有新的元素被添加到list
         * , 或者是ByteBuf 没有更多的可读字节为止
         * 如果list out 不为空,就会将list的内容传递给下一个 channelinboundhandler处理, 该处理器的方法也会被调用多次
         *
         * @param ctx 上下文对象
         * @param in 入站的 ByteBuf
         * @param out List 集合,将解码后的数据传给下一个handler
         * @throws Exception
         */
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    
            System.out.println("ByteToMessageDecode解码器被调用了......");
            //因为 long 8个字节, 需要判断有8个字节,才能读取一个long
            if(in.readableBytes() >= 8) {
                out.add(in.readLong());
            }
        }
    }

    3.解码器-ReplayingDecoder

    实例分析

    public class RepDeco extends ReplayingDecoder<Void> {
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    
            System.out.println("ReplayingDecoder解码器被调用了......");
            //在 ReplayingDecoder 不需要判断数据是否足够读取,内部会进行处理判断
            out.add(in.readLong());
    
    
        }
    }

    4.MessageToByteEncoder编码器

    实例分析

    public class MTBEnco extends MessageToByteEncoder<Long> {
        //编码方法
        @Override
        protected void encode(ChannelHandlerContext ctx, Long msg, ByteBuf out) throws Exception {
    
            System.out.println("MessageToByteEncoder编码器被调用,即将编码:"+msg);
            out.writeLong(msg);
    
        }
    }
  • 相关阅读:
    关于CQRS(老外经典好文)
    关于Autofac的使用陷阱
    文件写入文件分布式系统(asp.net C#)
    NET Framework 4.5.2
    asp.net开源
    关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
    sql SELECT时的with(nolock)选项说明
    树形结构的数据库表Schema设计
    C#操作符??和?:
    Byte[]和BASE64之间的转换
  • 原文地址:https://www.cnblogs.com/hyy9527/p/13100676.html
Copyright © 2011-2022 走看看