由于网络传输等原因,原始发出的消息和收到的消息可能不一致。可能多条消息粘在一起变成一条,也可能一条消息分了几条。本篇介绍几种解决方案。

LineBasedFrameDecoder换行符分隔
netty预设了一个解码器LineBasedFrameDecoder,参数为消息最大长度。收到消息时,会检查其中的换行符,将每个换行符之间的内容作为一条消息,交给MyHandler处理,客户端发过来的消息中必须包含换行符。
ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
ch.pipeline().addLast(new MyHandler());
DelimiterBasedFrameDecoder自定义分隔符
可以配置自定义的分隔符,比如这里使用 | 竖线来作分隔符。
ByteBuf delimiter = Unpooled.copiedBuffer("|".getBytes());
ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,delimiter));
ch.pipeline().addLast(new MyHandler());
FixedLengthFrameDecoder固定长度
强制每条消息长度,这里设6,每6个字符认定为一条消息。
ch.pipeline().addLast(new Fi

本文详细介绍Netty中解决消息粘包与半包问题的方法,包括LineBasedFrameDecoder、DelimiterBasedFrameDecoder、FixedLengthFrameDecoder及LengthFieldBasedFrameDecoder等解码器的使用,以及自定义解码器的设计思路。
最低0.47元/天 解锁文章
473

被折叠的 条评论
为什么被折叠?



