IoHandler 初步认识

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

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/124012927