www.pudn.com > cmpp.rar > ClientSessionHandler.java


package com.fetion.cmpp.client; 
 
import java.net.InetSocketAddress; 
 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.apache.mina.common.ConnectFuture; 
import org.apache.mina.common.IdleStatus; 
import org.apache.mina.common.IoHandlerAdapter; 
import org.apache.mina.common.IoSession; 
import org.apache.mina.common.RuntimeIoException; 
import org.apache.mina.filter.codec.ProtocolCodecFilter; 
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; 
import org.apache.mina.filter.logging.LoggingFilter; 
import org.apache.mina.transport.socket.SocketConnector; 
import org.apache.mina.transport.socket.nio.NioSocketConnector; 
 
import com.fetion.cmpp.common.Message; 
import com.fetion.cmpp.common.ServerResponse; 
 
/** 
 * 客户端连接到服务器端的处理类 
 * @author Administrator 
 * 
 */ 
public class ClientSessionHandler extends IoHandlerAdapter { 
 
    private static Log logger = LogFactory.getLog(ClientSessionHandler.class); 
 
    public static final int CONNECT_TIMEOUT = 30; 
 
    private String host; 
    private int port; 
    private SocketConnector connector; 
    private IoSession session; 
	 
	private CmppListener listener; 
	 
	private boolean finish =false; 
 
	public ClientSessionHandler(String host, int port,CmppListener listener) { 
        this.host = host; 
        this.port = port; 
		this.listener = listener ; 
        connector = new NioSocketConnector(); 
        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); 
        connector.getFilterChain().addLast("logger", new LoggingFilter()); 
        connector.setHandler(this); 
//        connector.setConnectTimeout(CONNECT_TIMEOUT); 
	} 
 
	public boolean isFinish() { 
		return finish; 
	} 
 
 
 
	public void setFinish(boolean finish) { 
		this.finish = finish; 
	} 
 
 
 
	public boolean isConnected() { 
        return (session != null && session.isConnected()); 
    } 
 
    public boolean connect() { 
    	boolean connected = false; 
        ConnectFuture connectFuture = connector.connect(new InetSocketAddress(host, port)); 
        connectFuture.awaitUninterruptibly(); 
        try { 
            session = connectFuture.getSession(); 
            connected = true; 
        } 
        catch (RuntimeIoException e) { 
        	connector.dispose(); 
        	listener.onException(e); 
        } 
        return connected; 
    } 
 
    public void disconnect() { 
        if (session != null) { 
            session.closeOnFlush().awaitUninterruptibly();    
            if(connector != null) 
            	connector.dispose(); 
            session = null; 
        } 
    } 
	 
	public void exceptionCaught(IoSession session, Throwable throwable) 
			throws Exception { 
		listener.onException(throwable); 
 
	} 
 
    public void sendCmppMessage(Message message) { 
        if (session == null) { 
            //noinspection ThrowableInstanceNeverThrown 
            listener.onException(new Throwable("not connected")); 
        } else { 
            session.write(message); 
        } 
    } 
     
	public void messageReceived(IoSession session, Object returnMessage) 
			throws Exception { 
		ServerResponse serverResponse = (ServerResponse)returnMessage; 
		listener.onServerResponse(serverResponse); 
		finish = true; 
		logger.info("serverResponse : "+serverResponse.getStatus()); 
	} 
	 
	public void sessionClosed(IoSession arg0) throws Exception { 
		listener.sessionClosed(); 
 
	} 
	 
	public void sessionOpened(IoSession session) throws Exception { 
		listener.sessionOpened(); 
	} 
 
	public void sessionCreated(IoSession session) throws Exception { 
//		session.write(message); 
	} 
 
	public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception { 
		// TODO Auto-generated method stub 
 
	} 
 
}