Netty5中的4种解码器

TCP以流的方式传输数据,上层的应用协议为了对消息进行区分,经常采用的方式有如下4种:

1、消息长度固定,累计读取的长度总和为约定的定长长度后,就认为读到了一个完整的消息;将计数器置位,重新开始读取下一条报文;

2、将回车换行符作为消息结束符,例如:FTP协议,这种方式在文本协议中应用比较广泛;

3、将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符;

4、通过在消息头中定义长度段来标示报文的总长度(以本人经验该方式在银行系统中应用最为广泛);

Netty对以上四种应用做了统一的抽象,提供了4种解码器来解决对应的问题,,分别是:

LineBasedFrameDecoder      换行符

DelimiterBaseFrameDecoder  分隔符

FixdLengthFrameDecoder     定长

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Netty框架提供了很多编码器和解码器,但有时候我们需要自定义编码器和解码器,以满足特定的业务需求。在Netty,自定义编码器和解码器非常简单,只需要继承ByteToMessageDecoder或MessageToByteEncoder,并实现其的抽象方法即可。 以下是一个自定义编码器的示例代码: ```java public class MyEncoder extends MessageToByteEncoder<MyMessage> { @Override protected void encode(ChannelHandlerContext ctx, MyMessage msg, ByteBuf out) throws Exception { byte[] data = msg.getData(); out.writeInt(data.length); out.writeBytes(data); } } ``` 在这个示例,我们定义了一个名为MyEncoder的编码器,它继承自MessageToByteEncoder,并实现了encode方法。在encode方法,我们首先获取消息的数据,然后将消息的数据长度写入到ByteBuf,最后将消息的数据写入到ByteBuf。 以下是一个自定义解码器的示例代码: ```java public class MyDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 4) { return; } int length = in.readInt(); if (in.readableBytes() < length) { in.resetReaderIndex(); return; } byte[] data = new byte[length]; in.readBytes(data); MyMessage message = new MyMessage(length, data); out.add(message); } } ``` 在这个示例,我们定义了一个名为MyDecoder的解码器,它继承自ByteToMessageDecoder,并实现了decode方法。在decode方法,我们首先判断ByteBuf是否有足够的字节可读,如果不够则直接返回。然后从ByteBuf读取消息的长度和数据,并将它们封装成MyMessage对象,加入到解码结果列表。 在使用自定义编码器和解码器时,只需要将它们注册到ChannelPipeline即可。以下是注册的示例代码: ```java ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new MyDecoder()); pipeline.addLast(new MyEncoder()); ``` 这样,在ChannelPipeline的所有ChannelHandler都可以使用MyMessage对象,而无需关心它们与字节流的转换过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值