Socket通信自定义mina 框架过滤器解析(处理粘包、断包问题)
来源:互联网 发布:免费制作网络结婚证 编辑:程序博客网 时间:2024/05/19 03:25
在与硬件打交道的通信中会经常遇到找不到合适的过滤器来接受服务传来的信息,为了解决这个问题,在网上找了很多资料,最后总结出一个自定义过滤器。我现在要用的是接收byte[]。
自定义一个过滤器只需要对应继承的三个文件
- ProtocolCodecFactory
- ProtocolEncoderAdapter
- CumulativeProtocolDecoder
工厂就不用多说了,ProtocolEncoderAdapter 不做处理 直接输出
public class ByteArrayEncoder extends ProtocolEncoderAdapter { @Override public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { out.write(message); out.flush(); }}
最重要的是继承 CumulativeProtocolDecoder的适配文件
@Override protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { if (in.remaining() > 1) {// 前1字节是包头 // 标记当前position的快照标记mark,以便后继的reset操作能恢复position位置 in.mark(); if (!isComplete) { byte[] l = new byte[header]; //我的第一位是len位 in.get(l); // 取包体数据长度 len = l[0]&0xff; ; // 将byte转成INT System.out.println("Len:"+len); } // 注意上面的get操作会导致下面的remaining()值发生变化 if (in.remaining() < len-1) { // 如果消息内容不够,则重置恢复position位置到操作前,进入下一轮, 接收新数据,以拼凑成完整数据 in.reset(); return false; } else { // 消息内容足够 in.reset();// 重置恢复position位置到操作前 int sumlen = len; byte[] packArr = new byte[sumlen]; in.get(packArr, 0, sumlen); IoBuffer buffer = IoBuffer.allocate(sumlen); buffer.put(packArr); buffer.flip(); out.write(buffer); buffer.free(); if (in.remaining() > 0) { // 如果读取一个完整包内容后还粘了包,就让父类再调用一次,进行下一次解析 return true; } } } return false;// 处理成功,让父类进行接收下个包 }
0 0
- Socket通信自定义mina 框架过滤器解析(处理粘包、断包问题)
- Mina通信粘包处理
- NIO框架之MINA源码解析(四):粘包与断包处理及编码与解码
- NIO框架之MINA源码解析(四):粘包与断包处理及编码与解码
- NIO框架之MINA源码解析(四):粘包与断包处理及编码与解码
- Apache mina 2.0.1 和 AS3 Socket 进行通讯(处理粘包问题)
- mina处理断包和粘包
- mina处理断包和粘包
- mina学习 粘包,断包处理
- mina处理断包和粘包
- mina IoBuffer 处理断包、粘包
- cocos2dx与mina通信粘包问题
- mina 自定义包的解析
- mina自定义编解码器接收处理byte数组(同时解决数据传输中的粘包、缺包问题)
- mina自定义编解码器接收处理byte数组(同时解决数据传输中的粘包、缺包问题)
- mina自定义编解码器接收处理byte数组(同时解决数据传输中的粘包、缺包问题)
- socket通信粘包问题
- Mina学习(四):实现自定义编解码器并解决半包,丢包,粘包问题
- 31.URL 管理(2)
- MongoDB 定时备份
- 图解 Android 事件分发机制
- 何时使用(post&get)
- 带你一步一步揭开Rxjava2.0的神秘面纱(6)
- Socket通信自定义mina 框架过滤器解析(处理粘包、断包问题)
- 论版本号的正确打开方式
- Glide-内存缓存与磁盘缓存
- Mybatis中Mapper内置方法细解
- opencv2 摄像机标定代码简化版 (ubuntu 16)
- 浅谈Android之Activity触摸事件传输机制介绍
- SylixOS 共用中断号机制
- 传智播客.黑马程序员,学C++不再难!
- System.Data.SQLite数据库简介