Java Mina 断包
mina框架 网上介绍的一大堆 就单纯说说自己项目上遇到的问题
- 返回数据格式 这个基本上是不一样的 所以需要自由发挥了
- 我这边项目接收到的数据有两个可以用来做标准的参数 一个每个指令会返回对应指令的编码,一个是每条指令返回的编码长度是固定的,所以只能采取一个笨办法 确定返回指令码后判断数量 不哔哔 直接上代码
@Override protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { CustomPack pack = new CustomPack(); int readLen = in.remaining(); if (readLen > 0) { in.mark(); //标记当前位置。以便reset byte[] preCodeArray = new byte[2]; in.get(preCodeArray); pack.setPreCode(preCodeArray);byte[] contentArray = new byte[readLen-2]; in.get(contentArray); pack.setContent(contentArray); //总长度163 if(contentArray[0] == Constant.ACCOUNT_GROUP_MESSAGE && readLen<160){ in.reset();//reset后 返回false return false; } out.write(pack); return in.remaining() > 0; } return false; }
doDecode在reset后返回false,会保留当前数据然后和下一条数据拼接后再返回过来 ,也就是说 当数据有 1 2 两段的时候 返回第一段 1 时 reset后return false ,那么下次接收到的数据就是 1+2 的数据
但是我们无法判断第三段数据到达的时候是不是还是该命令的回调数据,所以就在后面做了一个长度判断
在网上也找了很多方法 我最开始是想直接找到一个获取指令返回数据的总长度的 但是没找到 所以只能根据接入的设备文档来写死长度了
否则就可以根据指令返回的总长度和当前获取数据的长度来做比较了 这样就不用根据其它条件来做处理了 也更灵活