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