针对TCP的粘包、拆包问题,Netty有自己的解决方式。
Netty通过预先指定的数据流编解码器,按照预先约定好的规则进行数据的解析,即可解决对应的粘包、拆包问题。
具体到代码层面,主要有以下几种解码器:
除了解码器之外,Netty 也提供了编码器,用于在发送数据前按照特定规则格式化消息。例如,对于 LengthFieldBasedFrameDecoder,可以使用 LengthFieldPrepender 编码器来在消息前添加长度字段。
这些解决方案全被封装到了handler中,我们可以基于Netty的责任链模式,进行如下调用即可:
serverBootstrap.group(bossGroup, workerGroup)
// channel fact
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ch.pipeline.addLast(new FixedLenghtFrameDecoder());
}
}
);