解决MINA中xml断包粘包问题

以下为具体操作程序:

package cy.its.service.signalControl.client.coder;

import java.nio.charset.Charset;

import org.apache.mina.core.buffer.IoBuffer;

import org.apache.mina.core.session.IoSession;

import org.apache.mina.filter.codec.CumulativeProtocolDecoder;

import org.apache.mina.filter.codec.ProtocolDecoderOutput;

import org.apache.mina.filter.codec.ProtocolEncoder;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

@SuppressWarnings(value="all")

public class MsgRequestDecoder extends CumulativeProtocolDecoder {

private static final Logger logger = (Logger) LoggerFactory.getLogger(ProtocolEncoder.class);

private final Charset charset;

public MsgRequestDecoder(Charset charset) {

this.charset = charset;

}

@Override

protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {

if (in.remaining() > 0) {

int length = in.limit()-in.position();

//System.out.println("tcp data length:"+length);

in.mark();

if(in.remaining()<4){

in.reset();

return false;

}

byte[] bytes = new byte[length];

in.get(bytes);

String aString=new String(bytes,"UTF-8");

int start=aString.indexOf("

int end=aString.indexOf("");

//等于-1下面代码报错

if(end==-1){

in.reset();

return false;

}

//防止start到end之间可能有中文字符,导致长度不对

int len2=aString.substring(0, end).getBytes().length;

if(start==0){

if(end

in.reset();

in.get(new byte[start]);

return false;

}

if(end!=-1){

in.reset();

byte[] bytes1 = new byte[len2+10];//这里不能使用end+10,因为start到end之间可能有中文字符,导致长度不对

in.get(bytes1);

String bString=new String(bytes1,"UTF-8");

out.write(bString);

if (in.remaining() > 0) {

return true;

}

}else{

in.reset();

return false;

}

}else if(start!=-1){

in.reset();

in.get(new byte[start]);

return true;

}else{

in.reset();

return false;

}

}

return false;

}

}

xml格式以结尾

如需更多干货,请评论关注哦!

解决MINA中xml断包粘包问题


分享到:


相關文章: