Mina1.1.7 Decoder逻辑

CumulativeProtocolDecoder.decode()

拿到IoSession中的ByteBuffer,如果有则设置usingSessionBuffer=true并且读取这个ByteBuffer;否则设置usingSessionBuffer=false,并且从网络流中读取ByteBuffer。

循环调用doDecode()方法进行解码,直到解码失败(doDecode返回false)或者解码成功并且刚好读取完当前的ByteBuffer。

如果还有没读取完的数据,则将数据拷贝到IoSession中的ByteBuffer头部;否则移除IoSession中的ByteBuffer,为下一次解码做准备。

ProtocolDecoderImpl.doDecode()

遍历所有decoder,调用具体的decodable()方法,返回状态为:
MessageDecoder.OK:确定当前使用的decoder。
MessageDecoder.NOT_OK:undecodables计数器增加1,如果undecodables个数等于decoder个数时,抛出异常。
MessageDecoder.NEED_DATA:返回false告诉CumulativeProtocolDecoder.decode()方法解码失败,等待更多数据。

注意调用decodable()方法后会还原ByteBuffer的position和limit。

调用具体的decode()方法,返回状态为:
MessageDecoder.OK:返回true告诉CumulativeProtocolDecoder.decode()方法解码成功。
MessageDecoder.NOT_OK:抛出异常。
MessageDecoder.NEED_DATA:返回false告诉CumulativeProtocolDecoder.decode()方法解码失败,等待更多数据。

你可能感兴趣的:(java,Mina,decoder)