netty4&5之学习之路_2

                                         

                                     直接进入正题,今天只要想总结的是tcp数据传输方式和netty的解码器。

                 对于TCP的传输方式,感觉如果是为了学习netty那先了解,想要完全知道那等以后学完netty再去看吧。tcp是个“流”的协议,就是没有界限的一串数据,就像河里的水你没办法给他分几段吧,即没有分界线,而你需要的数据包,就在这个河里流到你服务器里,但是并不定是完整的给你,可能一个完整数据包分几段给你,也可能和其他数据包粘在一起给你,这就是常说的TCP拆包/粘包。


               原因比较复杂,不妨我们先想想怎么解决这个问题呢? 

               1。消息定长,每个报文大小固定,比如长度128,不够就用空格补上。

               2。在每个数据包尾部天捏特殊符号以遍服务器分割。比如ftp协议是以回车换行符进行分割的。

               3。将消息分割为消息头和消息体,消息头中包含消息总长度,通常这种消息头第一个字段视同int32来表示消息的长度。

               4。自己创造。。。。

                 那么用netty怎么解决呢?

               netty默认提供了多种编码器用于处理tcp拆包/粘包。只要熟练适应这些类库,传输问题就会变得很容易。

                      常用的decoder。

         1.LineBasedFrameDecoder。使用起来也容易只需要在initchannel()中即你自己写的handler上面加上ch.pipeline().addLast(new LineBasedFrameDecoder(1024)).

              

protected void initChannel(SocketChannel arg0) throws Exception {
   arg0.pipeline().addLast(new LineBasedFrameDecoder(1024));
   arg0.pipeline().addLast(new StringDecoder());
   arg0.pipeline().addLast(new Myhandler());
}

              LineBasedFrameDecoder工作原理是他一次遍历ByteBuf中的可读字节判断看是否有“\n”, "\r\n"如果有就在此位置作为结束位置,这条数据作为一个完整的消息,交给下面的handler使用参数1024指的是,编码器支持单行的最大长度例如LineBasedFrameDecoder读了1024个字节还是没有“\n”, "\r\n",那么会报错抛出异常,这样做的好处是防止无限读下去,系统内存泄露。一般和Stringdecoder组合可以变为按行切换的文本编码器。

2.DelimiterBasedFrameDecoder。分隔符解码器。用户指定分隔符,然后他会根据你指定的分隔符对消息分割。而上面讲的LinebasedFrameDecoder是特殊的DelimiterBasedFrameDecoder。分隔符的指定:与大家的习惯不同,分隔符并非以char或者string作为构造参数,而是ByteBuf。

public void initChannel(SocketChannel ch){

ByteBuf delimiter=Unpooled.copiedBuffer("&_$_".getBytes());

ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,delimiter));

ch.pipeline().addLast(new StringDecoder());

ch.pipeline().addLast(new Myhandler());

3

FixedLengthFrameDecoder是固定长度解码器,它能够按照指定的长度对消息进行自动解码,开发者不需要考虑TCP的粘包/拆包等问题,非常实用。

对于定长消息,如果消息实际长度小于定长,则往往会进行补位操作,它在一定程度上导致了空间和资源的浪费。但是它的优点也是非常明显的,编解码比较简单,因此在实际项目中仍然有一定的应用场景。

利用FixedLengthFrameDecoder解码器,无论一次接收到多少数据报,它都会按照构造函数中设置的固定长度进行解码,如果是半包消息,FixedLengthFrameDecoder会缓存半包消息并等待下个包到达后进行拼包,直到读取到一个完整的包。

这节主要讲的几个解码器在项目中也是比较常用的而且对于学期其他的编码器也打也一些基础。


      

你可能感兴趣的:(netty)