netty编码与解码

1、编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码 ,codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据。

2、netty提供的编码器和解码器有:

StringEncoder,对字符串数据进行编码

ObjectEncoder,对 Java 对象进行编码

StringDecoder, 对字符串数据进行解码

ObjectDecoder,对 Java 对象进行解码

MessageToByteEncoder 编码器,这个解码器是一个抽象类,需要实现它提供的方法来完成自己的业务需求。

ByteToMessageDecoder 解码器,这个解码器是一个抽象类,需要实现它提供的方法来完成自己的业务需求。

ReplayingDecoder<s> 解码器,
ReplayingDecoder扩展了ByteToMessageDecoder类,使用这个类,我们不必调用readableBytes()方法。

参数S指定了用户状态管理的类型,其中Void代表不需要状态管理

LineBasedFrameDecoder:这个类在Netty内部也有使用,它使用行尾控制字符(\n或者\r\n)作为分隔符来解析数据。
DelimiterBasedFrameDecoder:使用自定义的特殊字符作为消息的分隔符。
HttpObjectDecoder:一个HTTP数据的解码器
LengthFieldBasedFrameDecoder:通过指定长度来标识整包消息,这样就可以自动的处理黏包和半包消息。

3、使用自定义编码器来进行编码和解码处理消息:

解码器1:

public class MyByteToLongDecoder extends ByteToMessageDecoder {

    /**
     * 解码器的方法
     * @param channelHandlerContext
     * @param byteBuf
     * @param list
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        System.out.println("MyByteToLongDecoder解码器被调用...");
        if(byteBuf.readableBytes() > 8){
            list.add(byteBuf.readLong());
        }

    }
}

解码器2:

public class MyByteToLongDecoder2 extends ReplayingDecoder<Void>{

    /**
     * 街按摩器方法
     * @param channelHandlerContext
     * @param byteBuf
     * @param list
     * @throws Exception
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值