Netty框架入门篇 - 编解码器

本文介绍了Netty框架中的编解码器概念,包括解码器和编码器的作用,如ByteToMessageDecoder、ReplayingDecoder、MessageToMessageDecoder、ByteToMessageEncoder和MessageToMessageEncoder等。Netty提供了TooLongFrameException来处理超过指定大小的帧,防止内存耗尽。同时,文章探讨了编解码器的组合使用,如ByteToMessageCodec、MessageToMessageCodec和CombinedChannelDuplexHandler,强调了代码的可重用性和可扩展性原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


什么是编解码器

每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换。这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将字节流从一种格式转换为另一种格式。那么它们的区别是什么呢?

如果将消息看作是对于特定的应用程序具有具体含义的结构化的字节序列—它的数据。 那么编码器是将消息转换为适合于传输的格式(最有可能的就是字节流);而对应的解码器则是将网络字节流转换回应用程序的消息格式。因此,编码器操作出站数据,而解码器处理入站数据 (摘自《Netty In Action》)

解码器

Netty中提供的解码器一共有两类:

  1. ByteToMessageDecoder和ReplayingDecoder:将网络上传输的二进制字节解码为业务消息
  2. MessageToMessageDecoder:将一种消息类型解码为另外一种,例如,在网络上传递HTTPS请求时,会先将二进制字节转化为HTTPS的密文,然后再将密文转化为HTTPS的明文

从提供的这两个类的类图可以看到,解码器都是实现了ChannelInboundHandler入站处理器的

什么时候会用到解码器呢:很简单,每当需要为 ChannelPipeline 中的下一个 ChannelInboundHandler 转换入站数据时会用到。此外,得益于 ChannelPipeline 的设计,可 以将多个解码器链接在一起,以实现任意复杂的转换逻辑

ByteToMessageDecoder

将字节解码为消息(或者另一个字节序列)是一项如此常见的任务,以至于 Netty 为它提供了一个抽象的基类:ByteToMessageDecoder。由于你不可能知道远程节点是否会一次性地发送一个完整的消息,所以这个类会对入站数据进行缓冲,直到它准备好处理

主要方法:

方法 描述
decode(ChannelHandlerContext ctx,ByteBuf in,List out) 这是你必须实现的唯一抽象方法。decode()方法被调用时将会传入一个包含了传入数据的ByteBuf,以及一个用来添加解码消息的List。对这个方法的调用将会重复进行,直到确定没有新的元素被添加到该 List,或者该 ByteBuf 中没有更多可读取的字节时为止。然后, 如果该 List 不为空,那么它的内容将会被传递给 ChannelPipeline 中的下一个 ChannelInboundHandler

实现一个接收一个包含简单int的字节流,每个int都需要被单独处理(需要注意,原子类型的int在被添加到list中时,会被自动装箱成Integer)

//继承ByteToMessageDecoder类,将字节解码为特定格式
public class ToIntegerDecoder extends ByteToMessageDecoder{
   

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
   
		//检查是否至少有4个字节可读(一个int的字节长度)
		if(in.readableBytes()>=4){
   
			//从入站ByteBuf中读取一个int,并将其添加到解码消息的List中
			out.add(in.readInt())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值