前言
在上一篇Netty 心跳 demo 中,了解了Netty中的客户端和服务端之间的心跳。这篇就来讲讲Netty中的粘包和拆包以及相应的处理。
名词解释
粘包: 会将消息粘粘起来发送。类似吃米饭,一口吃多个饭粒,而不是一粒一粒的吃。
拆包: 会将消息拆开,分为多次接受。类似喝饮料,一口一口的喝,而不是一口气喝完。
简单的来说:
多次发送较少内容,会发生粘包现象。
单次发送内容过多,会发生拆包现象。
我们使用简单的Netty的服务端和客户端demo用来测试粘包和拆包。
将 Hello Netty 发送一百次,就会发送粘包现象;
将《春江花月夜》和《行路难》发送一次就会发送拆包现象;
示例图:
粘包:
拆包:
解决粘包、拆包
因为Netty已经提供了几个常用的解码器,帮助我们解决这些问题,所以我们不必再去造轮子了,直接拿来用就好了。
解决粘包
在Server服务端使用定长数据帧的解码器 FixedLengthFrameDecoder之后。
可以明显看到数据已经按照我们所设定的大小分割了。
解决拆包
在Server服务端使用字节解码器 LineBasedFrameDecoder 之后。
由于字节已经超过我们设置的最大的字节数,所以报错了。
所以,我们发送的字节在设置的范围内的话,就可以看到拆包现象已经解决。
Netty还提供了一个HttpObjectAggregator类用于解决粘包、拆包现象。
以下摘自Netty官方文档
|
|
使用HttpObjectAggregator 之后
可以看到,粘包和拆包现象得到了改善。
那么开始贴代码,几乎和之前的demo一样。
服务端:
|
|
|
|
|
|
客户端
|
|
|
|
|
|
该项目我放在github上了,有兴趣的可以看看!https://github.com/xuwujing/Netty
版权声明:
作者:虚无境
博客园出处:http://www.cnblogs.com/xuwujing
CSDN出处:http://blog.csdn.net/qazwsxpcm
个人博客出处:http://www.panchengming.com
原创不易,转载请标明出处,谢谢!