IoHandler是对数据的最终处理,它会得到数据的信息和状态,尽管处理是在IoHandler里面,但是真正执行通讯的是IoSession,它如同一个载体
private IoHandler handler = new IoHandler() {
/**
* session create
*/
public void sessionCreated(IoSession session) throws Exception {
SocketAddress socketAddress = session.getRemoteAddress();
String address = socketAddress2Str(socketAddress);
// 2.如果地址是127.0.0.1,则转换为真实IP地址
String ip = address.substring(0, address.indexOf(":"));
String port = address.substring(address.indexOf(":") + 1);
if (ip.equals("127.0.0.1")) {
String localAddress = getLocalAddress();
address = localAddress.substring(0, localAddress.indexOf(":")) + ":" + port;
}
// 保存到session attribute
session.setAttribute(ADDRESS, address);
// 保存session
sessionMap.put(address, session);
sessionCreateTime.put(session, System.currentTimeMillis());
}
/**
* session opened
*/
public void sessionOpened(IoSession session) throws Exception {
// do nothing
}
/**
* session closed
*/
public void sessionClosed(IoSession session) throws Exception {
// 移除session
String address = (String) session.getAttribute(ADDRESS);
if (address != null) {
sessionMap.remove(address);
sessionCreateTime.remove(session);
if (logger.isDebugEnabled()) {
logger.debug("当前连接的连接数为:" + sessionMap.size());
}
}
}
/**
* session idle
*/
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
// 空隙时间大于设置的自动断开时间,断开连接
long idleTime = System.currentTimeMillis() - session.getLastReadTime();
if (idleTime > autoDisconnectTimeout) {
session.close(false);
return;
}
}
/**
* exception caught
*/
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
// 获取远端地址
String address = (String) session.getAttribute(ADDRESS);
// 关闭session
session.close(false);
// 通知异常监听器
Exception exception = new Exception("连接异常[" + address + "]", cause);
// 调用异常listener
exceptionListener.onException(address, exception);
}
/**
* message received
*/
public void messageReceived(IoSession session, Object message) throws Exception {
byte[] msg = (byte[]) message;
// 回应心跳消息
if (msg.length == 1 && msg[0] == HEART_REQUEST_MARK) {
session.write(new byte[] { HEART_RESPONSE_MARK });
return;
}
// 获取session保存的地址
String address = (String) session.getAttribute(ADDRESS);
// 调用accept listener
acceptListener.handleMessage(address, msg);
}
/**
* message sent
*/
public void messageSent(IoSession session, Object message) throws Exception {
// do nothing
}
};
IoHandler处理事件在Filter Chain 之后进行。IoHandler包含处理以下几个事件的功能:
1. sessionCreated event:
session创建事件,对于Tcp而言该事件在连接建立时触发,对Udp而言,该事件在Udp数据包到达时触发。该功能常被用于初始化session的属性。
2. sessionOpened event:
session打开事件,该事件一般在sessionCreated事件之后发生。
3. sessionClosed event:
session关闭事件,该事件在session关闭时触发。
4. sessionIdle event:
session闲置事件,当session空闲时触发该事件,该功能在udp中不会不触发
5. exceptionCaught event:
异常捕获事件
6. messageReceived event:
消息接受事件,当接受到一个消息时,该事件被触发
7. messageSent event:
消息发送事件,当发送一个消息时,该事件被触发
参考:
Mina学习之IoHandler - marco_tan - 博客园https://blog.csdn.net/leng1987021/article/details/84238467