netty中LengthFieldBasedFrameDecoder的使用

转载 2015年07月11日 09:56:34

在org.jboss.netty.handler.codec.frame包中,有LengthFieldBasedFrameDecoder类用来解析带有长度属性的包,只要我们在传输协议中加入包的总长度就行了(也许有更好的方法)

 

具体方法:

1.可在数据包前加4个字节表示包的总长度,例如:

 

/** 
* 传输协议
* |------------------------------------------
* |总长度4byte |pkey长度4byte      |
* |------------------------------------------
* | value 4byte|name 4byte|zip  1 |
* |------------------------------------------
* |skey值      8byte(long型时间,固定) |
* |------------------------------------------------
* |  包体内容                                             |
* |                    
* |------------------------------------------------

在通过netty传输数据之前,执行

 

2.在接受的ChannelPipeline中加入decoder,加在handler之前,例如:

 

 

  1. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  2.            public ChannelPipeline getPipeline() throws Exception {  
  3.             ChannelPipeline pipeline = new DefaultChannelPipeline();  
  4.             pipeline.addFirst("decoder", new LengthFieldBasedFrameDecoder(100000000,0,4,0,4));  
  5.             pipeline.addLast("handler", new XXX(config));  
  6.             return pipeline;  
  7.            }  
  8.        });  

 

 

使用LengthFieldBasedFrameDecoder作为decoder实现,LengthFieldBasedFrameDecoder构造函数,第一个参数为信息最大长度,超过这个长度回报异常,第二参数为长度属性的起始(偏移)位,我们的协议中长度是0到第3个字节,所以这里写0,第三个参数为“长度属性”的长度,我们是4个字节,所以写4,第四个参数为长度调节值,在总长被定义为包含包头长度时,修正信息长度,第五个参数为跳过的字节数,根据需要我们跳过前4个字节,以便接收端直接接受到不含“长度属性”的内容。

 

至此,接收端会按照decoder指定的长度接收完整后才会调用handler继续处理信息。

相关文章推荐

一起学Netty(九)之LengthFieldBasedFrameDecoder

之前介绍了Netty天然的几种解析器,也稍微介绍了一下ByteToMessageDecoder类,我们对Netty的解码器还是有了一定的了解~ 今天要介绍的是Netty中一个很重要的...

Netty4.0中LengthFieldBasedFrameDecoder的使用心得

本文主要是针对遇到二进制数据包的粘包与分包问题的学习心得。 Netty作为服务端中LengthFieldBasedFrameDecoder的使用,其中使用1)Netty自带客户端;2)java.net...

一起学Netty(九)之LengthFieldBasedFrameDecoder

之前介绍了Netty天然的几种解析器,也稍微介绍了一下ByteToMessageDecoder类,我们对Netty的解码器还是有了一定的了解~ 今天要介绍的是Netty中一个很重要的解码器,因为相...
  • linuu
  • linuu
  • 2016-05-11 19:43
  • 16528

netty入门学习(4)-LengthFieldPrepender和LengthFieldBasedFrameDecoder

在netty入门学习(1)中我们曾经提到NIO为了提高效率,默认情况下可以服务端一次write造成客户端多次read,或者服务商多个write但客户端一次全读取过来。模拟演示如下: 改正前: 服务...

netty中LengthFieldBasedFrameDecoder的使用

在org.jboss.netty.handler.codec.frame包中,有LengthFieldBasedFrameDecoder类用来解析带有长度属性的包,只要我们在传输协议中加入包的总长度就...
  • zshake
  • zshake
  • 2015-12-23 15:33
  • 1141

netty5 LengthFieldBasedFrameDecoder实例(解决半包)

1,使用LengthFieldPrepender编码,LengthFieldBasedFrameDecoder解码的netty传输 可以解决半包粘包 2 代码部分 tcpserver package...

netty源码分析之FrameDecoder(LengthFieldBasedFrameDecoder)

我们接下来看一个也是比较重要的的解码器LengthFieldBasedFrameDecoder,这个和DelimiterBasedFrameDecoder比起来没有那么难理解,所以我们简单的看一下。 ...

Netty LengthFieldBasedFrameDecoder

先看看LengthFieldBasedFrameDecoder的官方API  http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/...

Netty学习(六)-LengthFieldBasedFrameDecoder解码器

在TCP协议中我们知道当我们在接收消息时候,我们如何判断我们一次读取到的包就是整包消息呢,特别是对于使用了长连接和使用了非阻塞I/O的程序。上节我们也说了上层应用协议为了对消息进行区分一般采用4种方式...

Netty LengthFieldBasedFrameDecoder

先看看LengthFieldBasedFrameDecoder的官方API  http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)