好久没写这个mina了,为了对之前的一篇博文Mina传输大数组,多路解码,粘包问题的处理 进行更进一步的补充,特此再来补说明。特别解决三个问题:
1,大数组粘包 在上篇的博文中提到用累积性解码器解决传输大数组的问题,还有可能出现粘包,解决方法是对decode方法进行了改进:
public MessageDecoderResult decode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
Context ctx =getContext(session);//获取session 的context
long matchCount=ctx.getMatchLength();//目前已获取的数据
long length=ctx.getLength();//数据总长度
IoBuffer buffer=ctx.getBuffer();//数据存入buffer
//第一次取数据
if(length==0){
length=in.getLong();
//保存第一次获取的长度
ctx.setLength(length);
matchCount=in.remaining();
}
else{
matchCount+=in.remaining();
}
ctx.setMatchLength(matchCount);
if (in.hasRemaining()) {// 如果buff中还有数
///改进的部分//
if(matchCount< length) {
buffer.put(in);// 添加到保存数据的buffer中
}
if (matchCount >= length) {// 如果已经发送的数据的长度>=目标数据的长度,则进行解码
final byte[] b = new byte[(int) length];
byte[] temp = new byte[(int) length];
in.get(temp,0, (int) (length-buffer.position()));//最后一次in的数据可能有多的
buffer.put(temp);
/
// 一定要添加以下这一段,否则不会有任何数据,因为,在执行in.put(buffer)时buffer的起始位置已经移动到最后,所有需要将buffer的起始位置移动到最开始
buffer.flip();
buffer.get(b);
<span style="font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> </span><span class="comment" style="margin: 0px; padding: 0px; border: none; color: rgb(0, 130, 0); font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;">自己解码的部分///</span><span style="margin: 0px; padding: 0px; border: none; font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 18px;"> </span>
ctx.reset();//清空
return MessageDecoderResult.OK;
} else {
ctx.setBuffer(buffer);
return MessageDecoderResult.NEED_DATA;
}
}
return MessageDecoderResult.NEED_DATA;
}
2,如果上传的数据有两种类型,也就是说有两个大数组,两个数组不停地轮流向通道中发数据,处理过程中也出现了不少问题。
首先,毋庸置疑肯定要用累积性解码器,在通信网速良好&