简介
网络传输都是转换为 2 进制进行传输
- 粘包
client 发送 2个 请求:hello hello
server 接收到 2个 请求:
hellohe
llo
或者 多个请求收到合并为一个请求 - 分包
client 发送1个请求: hello
server 接收到:
2个请求
he
llo
解决
通过标识标志位
定义一个稳定的结构 length + hello
- client
发送: length + data - server
接收:根据 length 判断数据的完整性
利用 FrameDecoder 来缓存数据 buffer。
MyDecoder extends FrameDecoder
if (完整){
读取
} else {
等待数据完整。
}
为什么FrameDecoder return的对象就是往下传递的对象?
- 最终还是调用了sendUpstream 。
FrameDecoder extends SimpleChannelUpstreamHandler implements LifeCycleAwareChannelHandler
为什么return null就可以缓存buffer
缓存在 Chinnelbuffer cumulation 中
buffer里面数据未被读取完怎么办?
FrameDecoder 中 cumulation 缓存读完,跳出。
容错,如果 Client 发送到一半宕机了
设置超时。
心跳机制,查看此channel 是否存在,
消息中是否还有未处理信息。
防止 Socket 攻击
- 原因:
数据结构:包头+长度+数据
Intger.max
把长度定义的很大,这种数据包,通常被称为socket攻击,字节流式攻击。 - 解决办法:
- 定义最大的 byte 大小。
清除现在可读大bytes .buffer.skipBytes(buffer.readableBytes());
还是没有办法判断何时 channel 数据是开始。 - 定义包头
找到起始点。
while (true){ //
if 包头 break;
}
…
- 定义最大的 byte 大小。