netty中LengthFieldBasedFrameDecoder的使用

转载 2015年07月06日 17:10:16

在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权威指南 第2版学习笔记7——MessagePack编解码及LengthFieldBasedFrameDecoder

MessagePack是一个高效的二进制序列化框架,像JSON一样支持不同语言间的数据交换,速度更快,序列化之后的码流更小MessagePack特点 编解码高效,性能高 序列化后的码流小 支持跨语言 ...
  • xundh
  • xundh
  • 2017年01月02日 21:55
  • 1567

netty5 LengthFieldBasedFrameDecoder实例(解决半包)

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

使用netty自定义rpc通信框架

  • 2017年08月23日 16:33
  • 16.53MB
  • 下载

基于netty的nio使用demo源码

  • 2016年05月04日 16:30
  • 6.47MB
  • 下载

使用Netty进行文件传输

在写出了Netty Hello World 和 netty对象传输之后,又觉得不够,看了官网的例子,所以有了现在的这个文件传输。 顺便说下,netty官网的例子真的好,如果要学习netty,还是看官...

【Netty4 简单项目实践】三、压缩消息体:使用google的protocol buff

老古董的C++程序员最讨厌的地方就是爱扣什么鸟传输带宽。讲道理,带宽上的那点开销和编解码的开销+代码维护(Json)成本比起来根本不值一提。 咱们继续。 ChannelHandlerContext原理...

resteasy使用netty

  • 2017年10月30日 15:57
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty中LengthFieldBasedFrameDecoder的使用
举报原因:
原因补充:

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