Netty 是如何解决粘包和拆包问题的?

Sherwin.Wei Lv7

Netty 是如何解决粘包和拆包问题的?

回答重点

Netty 提供了丰富的自带解码器为我们解决粘包和拆包的问题,也可以让我们自定义序列化解码器。

Netty 自带的解码器

  • DelimiterBasedFrameDecoder:分隔符解码器,使用特定分隔符来分割消息。
  • FixedLengthFrameDecoder:固定长度的解码器,可以按照指定长度对消息进行拆包,如果长度不够的话,可以使用空格进行补全,适用于每个消息长度固定的场景。
  • LengthFieldBasedFrameDecoder:可以根据接收到的消息的长度实现消息的动态切分解码,适用于消息头包含表示消息长度的字段的场景。
  • LineBasedFrameDecoder:发送端发送数据包的时候,数据包之间使用换行符进行分割,LineBasedFrameDecoder 就是直接遍历 ByteBuf 中的可读字节,根据换行符进行数据分割。

自定义编解码器

对于更杂场景,可以自定义解码逻辑,继承 ByteToMessageDecoder 实现一个自定义的解码器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CustomFrameDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
if (in.readableBytes() < 4) {
return;
}
in.markReaderIndex();
int length = in.readInt();
if (in.readableBytes() < length) {
in.resetReaderIndex();
return;
}
byte[] bytes = new byte[length];
in.readBytes(bytes);
CustomMessage message = new CustomMessage(bytes);
out.add(message);
}
}

扩展知识

Comments