由于数据在网络传输过程中,因为客户端和服务端没有约定好一个数据结构,就有可能粘包现象或分包现象,这样就需要定义数据包协议
比如我要传递一句话:I want to learn English and you?
粘包现象就是 I want tolearn English and you?
分包现象就是I want to learn English and you?
粘包和分包出现的原因是:没有一个稳定数据结构,
一般解决办法就是采取分隔符 如 I want to learn English|and you?|
另一种方法就是长度 + 数据23I want to learn English13give me a tea
然后一般基于netty开发程序都会定义数据包格式,格式如下
/**
*
* <pre>
* 数据包格式
* +——----——+——-----——+——----——+——----——+——-----——+
* | 包头 | 模块号 | 命令号 | 长度 | 数据 |
* +——----——+——-----——+——----——+——----——+——-----——+
* </pre>
* 包头4字节
* 模块号2字节short
* 命令号2字节short
* 长度4字节(描述数据部分字节长度)
*
*
*/
Netty中的 FrameDecoder 这个decoder可以协助我们解决粘包分包问题
1问:消息如何在管道中流转?当前的一个handler如何往下面的一个handler传递一个对象?
答:一个管道中会有多个handler,handler往下传递对象的方法是sendUpstream(event)
2为什么FrameDecoder return的对象就是往下传递的对象
答:还是调用了sendUpstream
3 buffer里面数据未被读取完怎么办? 为什么return null就可以缓存buffer?
答:cumulation缓存 FrameDecoder里面的cumulation其实就是一个缓存的buffer对象
4由于数据包格式包头+长度+数据,假如有的用户每次传输长度都是Intger.max,这种数据包,通常被称为socket攻击,字节流式攻击