日期:2014-05-20  浏览次数:20867 次

关于mina数据奇怪问题
mina框架中,客户端向服务端发送数据,服务端接收到的数据总是会乱:以下是mina的解码类:
public class BlmProtocolDecoder extends ProtocolDecoderAdapter {

    @Override
    public void decode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) throws Exception {
        if (ioBuffer == null || protocolDecoderOutput == null) {
            return;
        }
        System.out.println("iobuffer length:"+ioBuffer.limit());
        byte[] buff = new byte[ioBuffer.limit()];
        ioBuffer.get(buff);
        String temp = new String(buff, CommConstants.UTF8_CHARSET_NAME);
        System.out.println(">>>>>>>>> " + temp);//在这接收到的字符串有时会乱
        if (temp.length() > 0) {
            String json = Encoder.decode(temp);
            PackageContent o = JsonHelper.deserialize(json);
            protocolDecoderOutput.write(o);
        }
    }
}

跟踪发现,从iobuffer中取的字符串,原本该一条完整的传输到服务端的,却分成了两条,正常时应该是:({"packageType":2,"packageSeq":71,"actionType":32769,"mac":"F4:B7:E2:7C:CA:D3","actionData":[]})
现在偶尔会这样分两条:
第一条:( 
第二条:{"packageType":2,"packageSeq":71,"actionType":32769,"mac":"F4:B7:E2:7C:CA:D3","actionData":[]})
导致解析失败。
这样的情况有20%的概率,不知道什么原因,求指导!
------解决方案--------------------
设置一下长度把
你用的默认长度发送的消息 
消息比默认长度长的时候会自动分成多个包发送
这样的话你就得检查是否已经接受了所有的包
------解决方案--------------------
启动监听的时候配下链路信息,例如:
// 创建服务端监控线程   
httpAcceptor = new NioSocketAcceptor();
// 链路优化配置
httpAcceptor.setReuseAddress(true);
httpAcceptor.getSessionConfig().setReuseAddress(true);
httpAcceptor.getSessionConfig().setReceiveBufferSize(10240);
httpAcceptor.getSessionConfig().setReadBufferSize(10240);
httpAcceptor.getSessionConfig().setSoLinger(-1);
httpAcceptor.getSessionConfig().setKeepAlive(true);

不过如果报文比较大,在网络中还是可能会被分包,最好是有某种机制来保证即使被分包也能在收到后自动组装起来,比如说有报文长度,或者结束符等等。