解码器
- 定义:将网络格式转换为应用程序的数据的组件。
- 用法:每当需要为ChannelPipeline中的下一个ChannelInboundHandler转换入站数据时会用到。
ByteToMessageDecoder抽象类

ReplayingDecoder抽象类
- 它扩展了ByteToMessageDecoder类,使我们不必调用readableBytes()方法。
- 它通过使用一个自定义的ByteBuf实现,ReplayingDecoderByteBuf,包装传入的ByteBuf实现了这一点,其将在内部执行该调用.
MessageToMessageDecoder抽象类

TooLongFrameException类
- 由于Netty是一个异步框架,所以需要在字节可以解码之前在内存中缓冲它们。因此,不能让解码器缓冲大量的数据以至于耗尽可用的内存。
- 该异常类将由解码器在帧超出指定的大小限制时抛出。
编码器
- 定义:将应用程序的数据转换为网络格式的组件。
- 用法:实现了ChannelOutboundHandler,并将出站数据从一种格式转换为另一种格式。
MessageToByteEncoder抽象类

MessageToMessageEncoder抽象类

编解码器
- 定义:同时具有编码器和解码器两种功能的单一组件。
- 用法:可以在同一个类中管理入站和出站数据和消息的转换。
ByteToMessageCodec抽象类
- 它结合了ByteToMessageDecoder和MessageToByteEncoder。
MessageToMessageCodec抽象类
- 它结合了MessageToMessageDecoder和MessageToMessageEncoder。
CombinedChannelDuplexHandler类
- 问题:结合一个解码器和编码器可能会对可重用性造成影响。
- 使用该类既能够避免这种惩罚,又不会牺牲将一个解码器和一个编码器作为一个单独的单元部署所带来的便利性。
SSL/TLS
- Netty实现了SslHandler,且在内部使用SSLEngine来完成加密通信的工作。
- 在大多数情况下,SslHandler将是ChannelPipeline中的第一个ChannelHandler。这确保了只有在所有其他的ChannelHandler 将它们的逻辑应用到数据之后,才会进行加密。
HTTP/HTTPS
聚合消息
- HTTP的请求和响应可能由许多部分组成,因此你需要聚合它们以形成完整的消息。为了消除这项繁琐的任务,Netty 提供了一个聚合器,它可以将多个消息部分合并为FullHttpRequest或者FullHttpResponse消息,因此将总是看到完整的消息内容。
- HttpObjectAggregator
压缩
- HttpContentDecompressor
HTTPS
- SslHandler
WebSocket
- WebSocket在客户端和服务器之间提供了真正的双向数据交换。
- 要想向应用程序中添加对于WebSocket 的支持,需要将适当的客户端或者服务器WebSocketChannelHandler 添加到ChannelPipeline 中。这个类将处理由WebSocket 定义的称为帧的特殊消息类型。
空闲连接和超时

解码协议
粘包与拆包
- 产生原因:
- 应用程序write写入的字节大小大于套接口发送缓冲区的大小。
- 进行MSS(最大报文长度)大小的TCP分段、以太网帧的payload大于MTU进行IP分片等。
- 主流解决方案:
- 消息定长,不够长的部分补位。
- 在包尾增加特殊字符进行切割。
- 消息分为消息头和消息体,在消息头中包含表示信息总长度的字段,然后进行业务处理。
Netty实现
- 基于分隔符的协议:使用定义的字符来标记的消息或者消息段(通常被称为帧)的开头或者结尾。
- 基于长度的协议:通过将它的长度编码到帧的头部来定义帧。
写大型数据
- 在写大型数据时,需要准备好处理到远程节点的连接是慢速连接的情况,这种情况会导致内存释放的延迟。
- FileRegion接口:通过支持零拷贝的文件传输的Channel 来发送的文件区域。
- ChunkedWriteHandler:在需要将数据从文件系统复制到用户内存中时可以使用,它支持异步写大型数据流,而又不会导致大量的内存消耗。
Protocol Buffers序列化
