不惑之年的硬件牛人转到软件自学之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、将变长帧大小编码进头部的消息

                

  

         

                 

    

展开阅读全文

没有更多推荐了,返回首页