2 qq 30684289 qq_30684289 于 2016.04.01 15:28 提问

mina心跳的实现和业务逻辑之间的问题
 @Override
    protected boolean doDecode(IoSession session, IoBuffer buffer,
            ProtocolDecoderOutput out) throws Exception {
        int position = buffer.position();
        //第一次读取数据的时候
        if(session.getAttribute("fileName")==null){
            session.setAttribute("fileName",buffer.getInt());
            session.setAttribute("fileContent", buffer.getInt());
            return false;
        }
        else{
            int fileName = (Integer) session.getAttribute("fileName");
            int fileContent = (Integer) session.getAttribute("fileContent");
            //数据全部传输完,开始解码
            if(buffer.limit()-buffer.position()>=fileContent+fileName){
                byte[] nameByte = new byte[fileName]; 
                byte[] contentByte = new byte[fileContent]; 
                PictureBean picture = new PictureBean();
                int start = buffer.position();
                int limit = buffer.limit();
                buffer.limit(start+fileName);
                buffer.slice().get(nameByte);
                picture.setFileName(nameByte);
                buffer.position(start+fileName);
                buffer.limit(limit);
                buffer.slice().get(contentByte);
                picture.setFileContent(contentByte);
                session.removeAttribute("fileName");
                session.removeAttribute("fileContent");
                out.write(picture);
                return true;
            }
            buffer.position(position);
            return false;
        }
}

刚刚学mina,用mina来传输文件可以了,客户端的encoder和服务端的Decoder是自定义的。
但是在想加入心跳的时候发现,心跳的内容会和业务的内容冲突,就是解码器那里很难把这两个完全分开。没用XMPP协议。想问下怎么不影响业务的情况下实现心跳

1个回答

u014481698
u014481698   2016.04.01 16:28
已采纳

心跳包内容是固定的啊。在解码完成后,可以判断出来了。
我记得可以添加心跳类,里面有判断吧。

 KeepAliveMessageFactory heartBeatFactory = new IMKeepAlive();
        // 设置时间
        KeepAliveFilter keepAliveFilter = new KeepAliveFilter(heartBeatFactory,
                IdleStatus.BOTH_IDLE, KeepAliveRequestTimeoutHandler.CLOSE,
                IDLE_TIME, TIME_OUT);

第一句话忽略吧。

qq_30684289
qq_30684289 回复风聆水净: 喔对了,我这个Decoder代码只是接文件的
2 年多之前 回复
qq_30684289
qq_30684289 回复风聆水净: 主要是进了Decoder,我贴了Decoder的代码,你看看,如果是心跳包进Decoder,我虽然能分辨出心跳包,但是存在问题就是,之前我测试的时候发现,心跳包的内容和文件的内容会混乱,因为我文件传得不是很快
2 年多之前 回复
u014481698
u014481698 回复qq_30684289: 你是指进入IoHandlerAdapter 的 messageReceived吗?那就只能手动判断是否是心跳内容了。我也就写过个IM的demo用过,也不太熟悉。不知道第一句有帮助没。
2 年多之前 回复
qq_30684289
qq_30684289 回复风聆水净: 嗯,这个我用了,不过心跳的内容还要经过解码器解码~还是绕不开业务那个解码器
2 年多之前 回复
u014481698
u014481698 IMKeepAlive 自己定义的心跳类 ,实现KeepAliveMessageFactory 接口
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【MINA】心跳机制
列上两篇好文章 http://www.cnblogs.com/pricks/p/3832882.html http://blog.csdn.net/cruise_h/article/details/13756219 心跳要解决的问题:说白了就是监控无效的连接并断开,多次超时无反应就断开的方式处理 MINA自带了对心跳协议的支持,可以对心跳做出细致的配置,本文在次基础上实现了
Apache MINA 连续自动发送心跳包
心跳包,那么就是验证服务器和客户端是否连接,只要设置session的idl时间差就行了 /** * session建立时调用 */ @Override public void sessionCreated(IoSession session) throws Exception { logger.info("-IoSession实例:" + session.toString());
Mina开源框架 心跳机制详解
本文纯手工制作,请用心观看。 在详细讲解mina的心跳机制前,读者需要已经具备了mina的基础知识。 如果不够了解,请查看一下连接。 http://www.cnblogs.com/pricks/p/3832882.html http://wandejun1012.iteye.com/blog/2065941 本文主要讲解的是Mina开源框架的心跳机制是如何实现的,以及对心跳机制的一个误区
mina心跳过滤器
一、Mina本身提供了一个过滤器类KeepAliveFilter,该过滤器用于在IO空闲的时候发送并且反馈心跳包,在KeepAliveFilter中共有五个构造器,最终调用的都是有五个参数的构造器            1)KeepAliveMessageFactory:该实例引用用于判断接受与发送的包是否是心跳包,以及心跳请求包的实现            2)IdleStatus:
mina服务端检测客户端心跳实例
服务端代码 public class MyServer { /** 30秒后超时 */ private static final int IDELTIMEOUT = 30; /** 15秒发送一次心跳包 */ private static final int HEARTBEATRATE = 15; /** 心跳包内容 */ private st
Mina服务端客户端心跳机制
心跳: 1、自定义数据包,在业务逻辑里接收,客户端判断读写空闲,大于一个半的心跳之后,在空闲处理里将session关闭,注册的监听里断线重连 2、tcp的keepalive,服务端、客户端相互发确认心跳,设置好对应的心跳场景(服务端写空闲大于n秒后,每隔一个时间周期发送一个心跳1111,客户端读空闲大于n秒后,每隔一个时间周期发送一个心跳2222) 客户端设置超时时间,大于超时时间后,没有收到
MINA框架中原生态心跳支持
MINA本身自带了对心跳协议的支持,可以对心跳做出细致的配置,昨天仔细研究了一下MINA的API文档,翻译了一下其中心跳的内容(翻译的不好请大家见谅),做了一个测试例子。和需要用到MINA此功能的同行一起探讨一下。   写道 这个IoFilter 对IoEventType. SESSION_IDLE状态发出保持连接的请求,同时发回保持连接请求的响应。  这个过滤器要和IoSessionCo
spring集成mina,包含心跳检测,实现服务端主动推送
服务端1.常规的spring工程集成nima时,pom.xml中需要加入如下配置: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.7.7</version> </dependency> <depen
mina 添加心跳包
1.检测心跳包的关键代码如下:setKeepAliveRequestInterval(30);定时进入IoHandlerAdapter子类的sessionIdle(IoSession session, IdleStatus status)回调方法;/****************************************************************************
Mina 中心跳filter使用 及其示例 (打包解包粗糙处理)——服务器篇
/**     * @Title: HeartBeatTestServer.java  * @Package com.underdark.March  * @Description: TODO(用一句话描述该文件做什么)  * @author Minsc Wang ys2b7_hotmail_com     * @date 2010-3-14 下午02:49:14  * @ve