Mina 中心跳filter使用 及其示例 (打包解包粗糙处理)——服务器篇

/**   
 * @Title: HeartBeatTestServer.java
 * @Package com.underdark.March
 * @Description: TODO(用一句话描述该文件做什么)
 * @author Minsc Wang ys2b7_hotmail_com   
 * @date 2010-3-14 下午02:49:14
 * @version V0.9.0
 */
package test.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;

import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.executor.OrderedThreadPoolExecutor;
import org.apache.mina.filter.keepalive.KeepAliveFilter;
import org.apache.mina.filter.keepalive.KeepAliveMessageFactory;
import org.apache.mina.filter.keepalive.KeepAliveRequestTimeoutHandler;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * @Description: MINA心跳测试服务器,仅供测试
 */
public class HeartBeatTestServer {

    private static final int PORT = 8889;
    /** 30秒后超时 */
    private static final int IDELTIMEOUT = 30;
    /** 15秒发送一次心跳包 */
    private static final int HEARTBEATRATE = 15;
    /** 心跳包内容 */
    private static final String HEARTBEATREQUEST = "HEARTBEATREQUEST";
    private static final String HEARTBEATRESPONSE = "HEARTBEATRESPONSE";
    
    private static SocketAcceptor acceptor;
    private static ExecutorService filterExecutor = new OrderedThreadPoolExecutor();
    private static IoHandler handler = new HeartBeatServerHandler();

    public static void main(String[] args) throws IOException {
        acceptor = new NioSocketAcceptor(Runtime.getRuntime()
                .availableProcessors());
        acceptor.setReuseAddress(true);
        acceptor.getSessionConfig().setReadBufferSize(1024);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,
                IDELTIMEOUT);
        ((SocketSessionConfig) acceptor.getSessionConfig())
                .setReceiveBufferSize(1024);

        acceptor.getFilterChain().addLast("threadPool",
                new ExecutorFilter(filterExecutor));
        acceptor.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory()));

        /** 主角登场 */

        KeepAliveMessageFactory heartBeatFactory = new KeepAliveMessageFactoryImpl();
        KeepAliveRequestTimeoutHandler heartBeatHandler = new KeepAliveRequestTimeoutHandlerImpl();
        KeepAliveFilter heartBeat = new KeepAliveFilter(heartBeatFactory,
                IdleStatus.BOTH_IDLE, heartBeatHandler);
        /** 是否回发 */
        heartBeat.setForwardEvent(true);
        /** 发送频率 */
        heartBeat.setRequestInterval(HEARTBEATRATE);
        acceptor.getFilterChain().addLast("heartbeat", heartBeat);

        /** *********************** */

        acceptor.setHandler(handler);
        acceptor.bind(new InetSocketAddress(PORT));
        System.out.println("服务器开启,监听端口:" + PORT);
    }

    /***
     * 这里的执行顺序是  分两条顺序
     * getResponse()---->isResponse();获取数据判断心跳事件(目的是判断是否触发心跳超时异常)
     * isRequest()----->getRequest(); 写回数据是心跳事件触发的数据(目的写回给服务器(客户端)心跳包)
     * 两条路线  没必要都实现行
     */
    private static class KeepAliveMessageFactoryImpl implements
            KeepAliveMessageFactory {

        /*
         * (non-Javadoc)
         *
         *返回给客户端的心跳包数据 return 返回结果才是客户端收到的心跳包数据
         */
        @Override
        public Object getRequest(IoSession session) {
            return HEARTBEATREQUEST;
        }

        /*
         * (non-Javadoc)
         *"接受到的客户端数据包"
         */
        @Override
        public Object getResponse(IoSession session, Object request) {
            return request;
        }

        /*
         * (non-Javadoc)
         *
         * @see
         * 判断是否是客户端发送来的的心跳包此判断影响 KeepAliveRequestTimeoutHandler实现类
         * 判断是否心跳包发送超时
         */
        @Override
        public boolean isRequest(IoSession session, Object message) {
            if(message.equals(HEARTBEATRESPONSE)){
                System.out.println("接收到客户端心数据包引发心跳事件                 心跳数据包是》》" + message);
            return true;
        }
            return false;
        }

        /*
         * (non-Javadoc)
         *
               判断发送信息是否是心跳数据包此判断影响 KeepAliveRequestTimeoutHandler实现类
         * 判断是否心跳包发送超时
         */
        @Override
        public boolean isResponse(IoSession session, Object message) {
            if(message.equals(HEARTBEATREQUEST)){
                System.out.println("服务器发送数据包中引发心跳事件: " + message);
                return true;
            }
            return false;
        }

    }

    /***

     * @Description: 当心跳超时时的处理,也可以用默认处理 这里like
     *               KeepAliveRequestTimeoutHandler.LOG的处理
     *
     */
    private static class KeepAliveRequestTimeoutHandlerImpl implements
            KeepAliveRequestTimeoutHandler {

        /*
         * (non-Javadoc)
         *
         * @seeorg.apache.mina.filter.keepalive.KeepAliveRequestTimeoutHandler#
         * keepAliveRequestTimedOut
         * (org.apache.mina.filter.keepalive.KeepAliveFilter,
         * org.apache.mina.core.session.IoSession)
         */
        @Override
        public void keepAliveRequestTimedOut(KeepAliveFilter filter,
                IoSession session) throws Exception {
            System.out.println("《*服务器端*》心跳包发送超时处理(及长时间没有发送(接受)心跳包)");
        }

    }
}


服务器 IoHandlerAdapter 继承类



/**   
 * @Title: HeartBeatServerHandler.java
 * @Package com.underdark.March
 * @Description: TODO(用一句话描述该文件做什么)
 * @author Minsc Wang ys2b7_hotmail_com   
 * @date 2010-3-14 下午02:50:40
 * @version V0.9.0
 */
package test.server;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

/**
 * @ClassName: HeartBeatServerHandler
 * @Description: 心跳测试服务器消息处理
 * @author Minsc Wang ys2b7_hotmail_com
 * @date 2011-3-7 下午02:49:14
 *
 */
public class HeartBeatServerHandler extends IoHandlerAdapter {

    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        System.out.println("捕获异常");
        cause.printStackTrace();
    }

    @Override
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        System.out.println("接受到客户端回话:  " + (String) message);
        session.write("连 你妹!");
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        super.messageSent(session, message);
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println("session被关闭");
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        System.out.println("session正空闲" + status.toString());
    }
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值