其实netty所有自带的decoder内置类都是继承与ByteToMessage的。
我们想要自定义自己的decoder就继承ByteToMessgae类就可以了。
前提:一般发送报文 报文中都会有数据的长度,或者规定了开头和结尾为特殊字符。
首先我们要知道netty发送和接收报文,都是事件驱动的,然后报文会读取到内核内存,后面再读取到用户内存,成为java可用的用户态。
在这个读取过程中,可能就会出现半包和粘包。
我们可以通过报文获取应该有的数据长度
1 int len = in.writerIndex();//获取写入byteBuf的报文长度 2 offset = //数据长度的位置,这个是协议中规定好的 3 if (len > 最大报文长度) { 4 in.skipByte() //如果超过最大报文长度还没找到数据位,就是垃圾报文 5 return null; 6 } 7 if (len < offset) { 8 in.resetReaderIndex();//重置读报文位置 9 return null; 10 } 11 if (offset < 0) { 12 ctx.close(); //异常数据 停止连接 13 } 14 15 if (offset > in.readableBytes()) { 16 in.resetReaderIndex(); //没有到达数据位说的报文长度 重置读报文位置 17 return; 18 } 19 20 //后面就可以写数据处理了 21 //如果分析完数据长度还有剩余的报文 会自动累计到下一次的 所有不用怕粘包
标签:netty,ByteToMessage,报文,offset,粘包,长度,半包 From: https://www.cnblogs.com/fromzore/p/16836414.html