关于mina的断包粘包问题网上有很多,但是大部分都感觉写的有些复杂而且不够美观,这里分享一个我的解决方案:
直接给出doDecode方法
protected boolean doDecode(IoSession is, IoBuffer ib, ProtocolDecoderOutput pdo) throws Exception {
int remain = ib.remaining();
if(remain < 4) {
return false;
}
int basePos = ib.position();
int length = ib.getInt(basePos + 0);
if(length > remain - 4) {
return false;
}
int protocol = ib.getInt(basePos + 4);
byte[] bytes = new byte[4+length];
MyBuffer buff = MyBuffer.wrap(bytes);
ib.get(bytes, 0, bytes.length);
//buff即为完整数,这里进行数据处理即可
return true;
}
这里我们规定客户端与服务器通信的所有数据的前4为作为数据长度。
步骤是这样:
1.判断长度是否大于4
2.判断长度是否大于前四位所记录的长度
3.读取数据
这里最重要的就是要理解doDecode方法返回true和false后,mina对数据的行为,只有真正理解之后才能更好的使用,网上已经有很多此类文章,这里不再复述。