关于mina数据奇怪问题

yinrongg 2014-03-25 03:48:38
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%的概率,不知道什么原因,求指导!
...全文
244 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivan_peter 2015-09-10
  • 打赏
  • 举报
回复
应该考虑tcp毡包断包发热 各种情况。
lnjhh 2014-03-25
  • 打赏
  • 举报
回复
启动监听的时候配下链路信息,例如: // 创建服务端监控线程 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); 不过如果报文比较大,在网络中还是可能会被分包,最好是有某种机制来保证即使被分包也能在收到后自动组装起来,比如说有报文长度,或者结束符等等。
yinrongg 2014-03-25
  • 打赏
  • 举报
回复
引用 1 楼 hardycheng 的回复:
设置一下长度把 你用的默认长度发送的消息 消息比默认长度长的时候会自动分成多个包发送 这样的话你就得检查是否已经接受了所有的包
mina在哪设置长度呢?
hardycheng 2014-03-25
  • 打赏
  • 举报
回复
设置一下长度把 你用的默认长度发送的消息 消息比默认长度长的时候会自动分成多个包发送 这样的话你就得检查是否已经接受了所有的包

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧