Mina中的粘包处理

mina框架虽然已经老了,不过还是比较常用的,遇到解码粘包问题时,就需要继承一个特定的解码器了——CumulativeProtocolDecoder。

顾名思义,这个解码器本身就是作为累积数据用的,为什么这么说呢?因为:
在deCode()方法返回false时,此解码器会把接收到的数据累积性地缓存至IoBuffer中

这样只要继承此解码器,然后稍做处理,就可以摆脱粘包问题了。
比如,一次通信数据的格式为

typelencontent
intintString

当我接收一次数据时,会首先通过得到len值来判断此次所有数据的长度,如果content的长度与len值相等,则此次数据接收完毕,否则将继续接收。

/**
 * 数据通信解码--处理粘包
 */
public class UpdateDataDecoder extends CumulativeProtocolDecoder {

    @Override
    protected boolean doDecode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) throws Exception {
        //标记位置,重置则从此处重置
        ioBuffer.mark();
        //报文类型
        int type = ioBuffer.getInt();
        //报文长度
        int len = ioBuffer.getInt();

        if (len > ioBuffer.remaining()) {
            //若长度不够,则重置iobuffer,继续解析
            ioBuffer.reset();
            return false;
        } else {
            //否则视为解析完毕
            String content1 = ioBuffer.getString(Charset.forName("utf-8").newDecoder());
            protocolDecoderOutput.write(content1);
            return true;
        }
    }

}

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值