用mina做基于tcp,udp有通讯有段时间了,一直对编码解码不是很熟悉,这次做项目的时候碰到了断包情况,贴一下解决过程,

我接受数据格式如下图所示:

unit32为c++中数据类型,代表4个字节,由上图可以看出第二个参数为数据长度

    protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
in.order(ByteOrder.LITTLE_ENDIAN);//c++中默认读取数据是这个模式
int remaining = in.remaining();
if (remaining > 0) { in.mark();// 标记当前位置,以便reset int head = in.getInt();//消息头对应上图0x0 int length = in.getInt();//数据长度 if (length > remaining) {// 如果消息内容不够,则重置,相当于不读取size
System.out.println("断包了, left=" + in.remaining()+ " length=" + length);
in.reset();
return false;// 接收新数据,以拼凑成完整数据 此时断掉的前半部分数据仍在缓冲区中等待读取
} else {//数据完整,封住新的IoBuffer中传给messageReceived方法处理
byte[] bytes = new byte[length - 8];//获取数据长度时已经读取了八个字节,在这里去掉
in.get(bytes);
IoBuffer buffer = IoBuffer.allocate(length);
buffer.putInt(head); //把刚才读取到的数据重新放入buffer中
buffer.putInt(length);
buffer.put(bytes);
buffer.flip();
out.write(buffer); if (in.remaining() > 0) {// 如果读取内容后还粘了包,就让父类再给一次,进行下一次解析
// System.out.println("package left="+in.remaining()+" data="+in.toString());
}
return true;// 这里有两种情况1:没数据了,那么就结束当前调用,有数据就再次调用
}
}
return false;// 处理成功,让父类进行接收下个包
}

中间遇到各种坑,总的来说还是对IoBuffer和mina框架的理解不够深入,记录下引以为戒........

最新文章

  1. boost字符串算法
  2. 基于UDP协议的程序设计
  3. iBatisSQL中prepend的问题
  4. javaScript入门--引用类型
  5. C++ -windows与unix路径分隔符
  6. SQL Server存储内幕系列
  7. [TYVJ] P1010 笨小猴
  8. Why we don’t recommend using List<T> in public APIs
  9. IIS中配置访问HTTPS
  10. ProcessExplorer使用分享
  11. MySQL 5.6表空间传输
  12. html5、canval 对 图片的压缩
  13. 有锁Iphone 3GS 6.0.1 降级刷到4.2.1 完美越狱+解锁
  14. Mysql日期时间Extract函数介绍
  15. Myeclipse如何更新maven
  16. 【SHOI2016】黑暗前的幻想乡
  17. C++中的栈内存和堆内存的区别
  18. OpenERP实施记录(14):收款处理
  19. spring boot 加载jsp
  20. 流畅的python和cookbook学习笔记(四)

热门文章

  1. [问与答]为什么 'a' in ('abc') 是True 而 'a' in ['abc'] 是False呢?
  2. Java中回调函数编写
  3. 小强的HTML5移动开发之路(2)——HTML5的新特性
  4. LCS问题(最长公共子序列)-动态规划实现
  5. iOS中关于UIApplication的详细介绍
  6. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
  7. g++和gcc的相同点和区别
  8. 跟我一起写Makefile(转)
  9. Hadoop DataNode不能正常工作的原因
  10. MacRuby 0.3发布,支持Interface Builder,和创建GUI用的HotCocoa