不惑之年的硬件牛人转到软件自学之netty框架(五)编码器和解码器、WebSocket
由于近期开发一个中型的物联项目,带着十来个兄弟从底层硬件到无线局域通信到通用网关到netty高可用框架到spring cloud的后台开发到移动端APP开发到WEB前端的开发整体框架的搭建,虽然很辛苦,但我一直在给兄弟们说我们要三年内在物联行业占有一席之地,期待项目的成功。就因为这样,我写出了这个netty自学框架,虽然也是开始学习,我想通过项目的历练肯定对大家都有用,加油!
今天是:2018年6月1日 主题:编码器和解码器
一、什么是编解码器
编码器是将消息转换成适合于传输的格式(最有可能的是字节流);而对应的解码器则是将网络字节流转换回应用程序的消息格式。因此,编码器操作出站数据,而解码器处理入站数据。
二、解码器
解码器包含的内容是:将字节解码为消息----ByteToMessageDecoder和ReplayingDecoder;将一种消息类型解码为另一种----MessageToMessageDecoder。
什么时候会用到解码器呢?很简单:每当需要为ChannelPipeline中的下一个ChannelInboundHandler转换入站数据时会用到。此外,得益于ChannelPipeline的设计,可以将多个解码器链接在一起,以实现任意复杂的转换逻辑。
1、抽象类ByteToMessageDecoder,它的方法如下:
假设接收了一个包含简单int的字节流,每个int都需要被单独处理。在这种情况下,你就需要从入站ByteBuf中读取每个int,并将它传递给ChannelPipeline中的下一个ChannelInboundHandler。为了解码这个字节流,你要扩展ByteToMessageDecoder类。
每次从入站ByteBuf中读取4字节,将其解码为一个int,然后将它添加到一个List中。当没有更多的元素可以被添加到该List中时,它的内容将会被发送给下一个ChannelInboundHandler。
代码如下:
2、抽象类ReplayingDecoder:扩展了ByteToMessageDecoder类,它通过使用一个自定义的ByteBuf实现,ReplayingDecoderByteBuf,包装传入的ByteBuf实现了这一点,其将在内容执行该调用。代码如下:
3、抽象类MessageToMessageDecoder,其API如下:
IntegerToStringDecoder的实现
InterToStringDecoder实现的代码如下:
4、TooLongFrameException类
由于Netty是一个异步框架,所以需要在字节可以解码之前在内存中缓冲它们。因此,不能让解码器缓冲大量的数据以至于耗尽可用的内存。为了解除这个常见的顾虑,Netty提供了TooLongFrameException类,其将由解码器在帧超出指定的大小限制时抛出。为了避免这种情况,你可以设置一个最大字节数的阀值,如果超出该阀值,则会导致抛出一个TooLongFrameException(随后会被ChannelHandler.exceptionCaught()方法捕获)。
二、编码器:实现了 ChannelOutboundHandler,并将出站数据从一种格式转换为另一种格式,和我们之前说的解码器的功能正好相反。其功能为:将消息编码为字节和将消息编码位消息。
1、抽象类MessageToByteEncoder,其API的方法为:
ShortToByteEncoder的实现:
、
2、抽象类MessageToMessageEncoder,其API如下:
使用IntegerToStringEncoder扩展了MessageToMessageEncoder,其设计图如下:
代码如下:
三、抽象的编解码器类
1、抽象类ByteToMessageCodec的API
2、抽象类MessageToMessageCodec的API
四、通过SSL/TLS保护Netty应用程序
1、SSL/TLS是一个安全协议,用以实现数据安全,其进行加密和解密的数据流如下:
2、SSLHandler的方法:
五、构建基于Netty的Http/Https应用程序
1、Http的解码器和编码器
2、添加HTTP的支持:只需要将正确的ChannelHandler添加到ChannelPipeline中即可
六、WebSocket提供了“在一个单个的TCP连接上提供双向的通信.........结合WebSocket API............它为网页和远程服务器之间的双向通信提供了一种替代HTTP轮询的方案”。要想向你的应用程序中添加对于WebSocket的支持,需要将适当的客户端或服务器WebSocket ChannelHandler添加到ChannelPipeline中。协议如下:
1、WebSocketFrame的类型
2、在服务器端支持WebSocket
要想为WebSocket添加安全性,只需要将SslHandler作为第一个ChannelHandler添加到ChannelPipeline中。
七、基于分隔符的协议
由行尾符分隔的帧
八、基于长度的协议
1、解码长度为8字节的帧
2、将变长帧大小编码进头部的消息