ServerHandler.java 3.12 KB
package com.bsth.socket.handler;

import java.io.IOException;
import java.util.Date;

import com.bsth.socket.protocol.Message01;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bsth.socket.manager.MessageProcessor;
import com.bsth.socket.manager.MessageSessionManager;
import com.bsth.socket.protocol.IMessageBody;
import com.bsth.socket.protocol.Message;

/**
 * @author Hill
 */
@Service
public class ServerHandler extends IoHandlerAdapter{
	
	private final static Logger log = LoggerFactory.getLogger(ServerHandler.class);
	@Autowired
	private MessageProcessor processor;
	
	public MessageProcessor getProcessor() {
		return this.processor;
	}

	@Override
    public void sessionCreated(IoSession session) throws Exception {
		SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
		cfg.setTcpNoDelay(true);
		cfg.setSoLinger(0);
    }

	@Override
    public void sessionOpened(IoSession session) throws Exception {
		
    }

	@Override
    public void sessionClosed(IoSession session) throws Exception {
        String deviceId = (String)session.getAttribute("deviceId");
        if (deviceId != null && session == MessageSessionManager.getInstance().getSession(deviceId)) {
        	MessageSessionManager.getInstance().unregister(deviceId);
    		log.warn("vin:" + deviceId + "断开连接");
        }
    }

	@Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		log.warn("idle 关闭连接, vin " + session.getAttribute("deviceId") + " status " + status + ",lastIo:" + new Date(session.getLastIoTime()) + ",now:" + new Date(System.currentTimeMillis()));
		session.closeNow();
    }

	@Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		if (cause instanceof IOException) {
			log.warn("handler exceptionCaught 关闭连接,vin " + session.getAttribute("deviceId"));
		}
		log.error("MessageServerHandler捕获异常", cause);
    }

	@Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        Message msg = (Message)message;
        IMessageBody body = msg.getMessageBody();
        String sDeviceId = (String)session.getAttribute("deviceId");
        if (body != null) {
        	String vin = msg.getVin();
        	log.warn("msg.getVin():" + vin);
        	if (Message01.COMMAND == msg.getCommand()) {
        		if (sDeviceId == null) {
        			MessageSessionManager.getInstance().register(vin, session);
        			log.warn("vin:" + vin + "建立连接");
        		}
        	}
        	processor.process(msg);
        } else {
        	log.warn("异常协议命令字:" + msg.getCommand());
        	if (sDeviceId == null) {
        		log.warn("未登入");
    		}
        }
    }

	@Override
    public void messageSent(IoSession session, Object message) throws Exception {
        
    }
}