* @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());
}
}