通过mina进行TCP开发,遇到对数据进行解码处理,网上例子基本都是帧长度定长,在doDecode中通过in.remaining()就可以判断得到的数据帧长度为多少,是否能够正常解析,长度不对返回false即可。
但,如果帧是变长的又怎么处理呢?
变长的帧格式一般如下:
说明 | 长度 | 例子 |
标识位 | 1B | 0x01 |
帧长度 | 1B | 0x20 |
帧内容 | 32B | 。。。 |
通过标识位判断是什么类型的帧,再通过帧长度判断帧内容有多长。
因此只有读取了标志位和帧长度才能知道当前处理缓冲区数据够不够分析完整的一帧,实际上关键的问题就是读取数据后怎么恢复缓冲区状态,不影响doDecode的下次分析。
方法就是通过IoBuffer的rewind方法。
代码例子:
protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) { if (in.remaining() < 2) return false; byte flag = in.get(); if (flag != (byte)0x01) return false; byte len = in.get(); if (in.remaining() < len) { in.rewind(); return false; } // 解析操作 }