传送门
《Netty 实战》第1,2,3章
《Netty 实战》第4,5,6章
《Netty 实战》第7,8,9章
《Netty 实战》第10,11章
《Netty 实战》第12,13章
前面9章主要是概念的部分,从第10章开始,主要就是实战的部分了.
第10章 编解码器
什么是编解码器
网络节点传输的原始字节和应用程序能理解的数据格式之间的转换工具.编码器操作出站数据,解码器处理入站数据.
无论是编码器还是解码器,本质上都是特殊的ChannelHandler-
解码器
主要分2种.字节解析为消息(ByteToMessageDecoder,ReplayingDecoder),消息类型转换(MessageToMessageDecoder).-
抽象类ByteToMessageDecoder
注意有个decodeLast(),这个方法用来在结束时候还能调用一次(可能ByteBuf并不完整).
- 抽象类ReplayingDecoder
这个类在内部包装decode()解析,如果没有足够的字节,就自动进入下一轮解析->简化了decode()方法.- 并不是所有的 ByteBuf 操作都被支持,如果调用了一个不被支持的方法,将会抛出一个 UnsupportedOperationException
- ReplayingDecoder 稍慢于 ByteToMessageDecoder。
- 抽象MessageToMessageDecoder
只需要实现唯一的decode()方法(因为是针对对象进行转换的,没有decodeLast的问题了) - TooLongFrameException类
不能让解码器缓冲大量数据,并耗尽内存,因而Netty内置了TooLongFrameException类,在解码器占用ByteBuf内存过多时候抛出.
-
// 缓冲区最大长度为1024字节
private static final int MAX_FRAME_SIZE = 1024;
// 先取出可读字节,然后判断是否已经超长.
int readable = in.readableBytes();
if (readable > MAX_FRAME_SIZE) {
in.skipBytes(readable);
throw new TooLongFrameException("Frame too big!");
}
- 编码器
主要分2种.消息编码为字节,消息编码转换.- 抽象类MessageToByteEncoder
重写encode()方法,输出out为ByteBuf - 抽象MessageToMessageEncoder
重写encode()方法,输出out为List(object)
- 抽象类MessageToByteEncoder
- 抽象的编解码器类
在一个类同时管理入站,出站.- 抽象类ByteToMessageCodec
- 抽象类MessageToMessageCodec
demo:统一处理Websocket的帧. - CombinedChannelDuplexHandler
结合一个解码器和编码器可能影响性能(毕竟只能有一个方向在工作),那么使用CombinedChannelDuplexHandler就能避免这个问题.(实际上是传入一个编码器和一个解码器创建)
public class CombinedByteCharCodec extends
CombinedChannelDuplexHandler<ByteToCharDecoder, CharToByteEncoder> {
public CombinedByteCharCodec() {
super(new ByteToCharDecoder(), new CharToByteEncoder());
}
}
第10章 预置的ChannelHandler和编解码器
Netty给了很多开箱即用的Handler.
通过 SSL/TLS 保护 Netty 应用程序
配置SslChannelInitializeer.-
构建基于Netty的Http/Https应用
-
Http解码器,编码器和编解码器
聚合Http消息-HttpAggregatorInitializer聚合为FullHttpRequest或者 FullHttpResponse.(原先可能有一个head,多个content)
HTTP压缩- HttpContentCompressor
Https-将SslHandler加到ChannelHandler的最前面
-
WebSocket-(WebSocket本身并没有新建端口,还是用原来HTTP建立的端口,只是走ws协议)
-
-
空闲的连接和超时
-
解码基于分隔符的协议和基于长度的协议
- 基于分隔符的协议(DelimiterBasedFrameDecoder,LineBasedFrameDecoder)
- 基于长度的协议(FixedLengthFrameDecoder,LengthFieldBasedFrameDecoder),其中LengthFieldBasedFrameDecoder和TCP协议类似,长度偏移量和长度里面.
写入大型数据(Chunk)
-
序列化数据
- JDK序列化
- JBossMarshalling序列化
-
Protocol Buffer序列号