package com.dy.rtuMw.server.forTcp; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.mina.core.session.IoSession; import com.dy.common.mw.channel.tcp.TcpIoSessionAttrIdIsRtuAddr; import com.dy.common.mw.channel.tcp.TcpIoSessionEventCallback; import com.dy.common.mw.core.CoreUnit; import com.dy.rtuMw.server.tasks.RtuUpTask; public class TcpIoSessionCallback implements TcpIoSessionEventCallback{ private static Logger log = LogManager.getLogger(TcpIoSessionCallback.class.getName()); /** * 网络连接打开 */ public void sessionOpened(IoSession session) throws Exception { log.info("网络连接建立,终端网址是:" + session.getRemoteAddress().toString()) ; } /** * 网络连接关闭 */ @Override public void sessionClosed(IoSession session) throws Exception { if(session != null){ String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey) ; if(rtuAddr != null){ //记录状态 RtuStatusDealer.offLine(rtuAddr); } log.info("网络连接关闭," + (rtuAddr==null?"":("终端地址是:" + rtuAddr))) ; //+ (session==null?"":(session.getRemoteAddress() == null?"":(session.getRemoteAddress().toString()==null?"":(",终端网址是:" + session.getRemoteAddress().toString()))))) ; } } /** * 发生异常 */ public void exceptionCaught(IoSession session, Throwable cause) throws Exception { if(session != null && cause != null){ String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey) ; log.error("网络会话发生异常," + (rtuAddr==null?"":("终端地址是:" + rtuAddr)) + (session==null?"":(session.getRemoteAddress() != null?(",终端网址是:" + session.getRemoteAddress().toString()):"")) + "\n异常消息:" + cause.getMessage(), cause); } } /** * TCP通道发送完数据后,回调的方法,进行后续数据处理 */ public void messageSended(IoSession session, Object message) throws Exception { String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey) ; log.info("网络发送了数据," + (rtuAddr==null?"":("终端地址是:" + rtuAddr)) + (session==null?"":(session.getRemoteAddress() != null?(",终端网址是:" + session.getRemoteAddress().toString()):"")) ); } /** * TCP通道接收到数据,回调的方法,进行数据处理 * 此方法调用后,上行数据脱离了NIO线程,进入了核心线程 */ @Override public void messageReceived(IoSession session, Object message)throws Exception { if(session != null && message != null){ RtuUpTask task = new RtuUpTask() ; task.data = new Object[]{session, (byte[])message} ; try{ CoreUnit.getInstance().pushCoreTask(task); }catch(Exception e){ log.error(e.getMessage(), e); } } } }