package mina.remote.server; import mina.remote.Reflection; import mina.remote.model.OperatorMessage; import mina.remote.model.User; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SuppressWarnings("unchecked") public class ServerHandler extends IoHandlerAdapter { private static final Logger LOGGER = LoggerFactory.getLogger("/mina/remote/server/ServerHandler"); @Override public void sessionOpened(IoSession session) { // 每60秒触发sessionIdle,IdleStatus.BOTH_IDLE 包含以下两种状态 // IdleStatus.WRITER_IDLE 表示当前session 60秒内没有发送数据 // IdleStatus.READER_IDLE 表示当前session 60秒内没有接收数据 session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60); } @Override public void messageReceived(IoSession session, Object message) { LOGGER.info("Message is: " + message.toString()); OperatorMessage om = (OperatorMessage) message; try { User user = (User) session.getAttribute("user");//获取会话中对象 /**如果是用户登录消息*/ if(om.getLogin()){ // check if the user is already used if (ServerContant.USERS.contains(user)) { session.write(false);//登录失败,用户已经存在 } User loginUser = (User)excMethod(session, om); ServerContant.SESSIONS.add(session); session.setAttribute("user", loginUser);//设置当前session用户 // Allow all users ServerContant.USERS.add(loginUser); session.write(true);//登录成功 }else{ /**只有登录授权用户才能调用远程方法*/ if(user!=null && ServerContant.USERS.contains(user)) session.write(excMethod(session, om));//执行用户方法 } } catch (Exception e) { e.printStackTrace(); } } @Override public void sessionIdle(IoSession session, IdleStatus status) { LOGGER.info("Disconnecting the idle."); } @Override public void messageSent(IoSession iosession, Object message) throws Exception { System.out.println("send messages :"+ message); } @Override public void sessionClosed(IoSession session) throws Exception { User user = (User) session.getAttribute("user"); ServerContant.USERS.remove(user); ServerContant.SESSIONS.remove(session); } @Override public void exceptionCaught(IoSession session, Throwable cause) { LOGGER.warn("Unexpected exception.", cause); session.close(true); } public Object excMethod(IoSession session,OperatorMessage om) throws Exception{ Class cls=Class.forName(om.getClassName()); Object test = ServerContant.CTX.getBean(cls); Object result = Reflection.invokeMethod(test,om.getMethod(),om.getParams()); return result; } }