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代码只是接文件的
一年多之前 回复
qq_30684289
qq_30684289 回复风聆水净: 主要是进了Decoder,我贴了Decoder的代码,你看看,如果是心跳包进Decoder,我虽然能分辨出心跳包,但是存在问题就是,之前我测试的时候发现,心跳包的内容和文件的内容会混乱,因为我文件传得不是很快
一年多之前 回复
u014481698
u014481698 回复qq_30684289: 你是指进入IoHandlerAdapter 的 messageReceived吗?那就只能手动判断是否是心跳内容了。我也就写过个IM的demo用过,也不太熟悉。不知道第一句有帮助没。
一年多之前 回复
qq_30684289
qq_30684289 回复风聆水净: 嗯,这个我用了,不过心跳的内容还要经过解码器解码~还是绕不开业务那个解码器
一年多之前 回复
u014481698
u014481698 IMKeepAlive 自己定义的心跳类 ,实现KeepAliveMessageFactory 接口
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!