ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Netty (7)-半包和粘包

2021-03-13 10:32:48  阅读:233  来源: 互联网

标签:Netty pipeline ch addLast 长度 粘包 消息 new 半包


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

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 FixedLengthFrameDecoder(6));
							ch.pipeline().addLast(new MyHandler());

LengthFieldBasedFrameDecoder自定义长度

通常消息长度不会是固定的,可以将每条消息长度放到消息内容中,由服务器动态识别长度。如下

							ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024,0,1));
							ch.pipeline().addLast(new MyHandler());
  • 参数1:1024是消息最大长度
  • 参数2:0是指长度参数的位置,即消息中第一个字节开始,用来表示消息的长度
  • 参数3:1是指长度参数的自身的长度,即1个字节。

一个字节用2个16进制表示,假如有16进制消息 03 aa bb cc,那么第一个字节03表示消息长度有3个字节,消息内容即aa bb cc。

自定义解码解决半包粘包

可以用自定义的解码器去判断消息的完整性,如果已经读到完整消息,就加入out中进行业务处理,否则就return继续读取。

public class MyDecoder extends ByteToMessageDecoder{
	
	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
		if("自定义判断,读取到了完整消息") {
			out.add("完整消息对象");
		}else {
			return ;    //继续读取
		}

 

 

标签:Netty,pipeline,ch,addLast,长度,粘包,消息,new,半包
来源: https://blog.csdn.net/wangb_java/article/details/108381960

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有