package com.jing.net;

import java.net.InetSocketAddress;


import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
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.nio.NioSocketConnector;

import com.jing.test.TcpClientTest;

/**
 * tcp客户端。依赖于mina-core-2.0.7.jar,slf4j-api-1.6.6.jar.<br/>
 * 生成客户端时,实现这个抽象类即可。
 * @author 朱志杰 QQ:862990787
 * Sep 5, 2013 9:36:31 AM
 */
public abstract class AbstractTcpClient extends IoHandlerAdapter{
	 /** The connector */
    protected IoConnector connector;

    /** The session */
    protected static IoSession session;

    /**
     * Create the UdpClient's instance
     */
    public AbstractTcpClient() {
        connector = new NioSocketConnector();
        connector.setHandler(this);
        ConnectFuture connFuture = connector.connect(new InetSocketAddress(getServerIp(), getServerPort()));
        connFuture.awaitUninterruptibly();
        session = connFuture.getSession();
    }
    
    /**
     * 功能:向服务端传送数据。
     * @author 朱志杰 QQ:862990787
     * Sep 5, 2013 10:30:05 AM
     * @param str
     */
    public void write(String str){
    	TcpClientTest t=new TcpClientTest();
		IoBuffer buffer = IoBuffer.allocate(str.getBytes().length);
        buffer.put(str.getBytes());
        buffer.flip();
		t.write(buffer);
    }
    
    /**
     * 功能:向服务端传送数据。
     * @author 朱志杰 QQ:862990787
     * Sep 5, 2013 10:30:05 AM
     * @param buffer
     */
    public void write(IoBuffer buffer){
    	 session.write(buffer);
    }
    
    /**
     * 功能:传入服务端的IP。
     * @author 朱志杰 QQ:862990787
     * Sep 5, 2013 10:07:55 AM
     * @return String
     */
    public abstract String getServerIp() ;
    
    /**
     * 功能:传入服务端的端口。
     * @author 朱志杰 QQ:862990787
     * Sep 5, 2013 10:07:55 AM
     * @return int
     */
    public abstract int getServerPort() ;

   /**
    * 出现异常时。
    */
    @Override
    public abstract void exceptionCaught(IoSession session, Throwable cause) throws Exception ;

    /**
     * 收到报文返回时。
     */
    @Override
    public abstract void messageReceived(IoSession session, Object message) throws Exception ;

    /**
     * 发送报文后。
     */
    @Override
    public abstract void messageSent(IoSession session, Object message) throws Exception ;

    /**
     * {@inheritDoc}
     */
    @Override
    public abstract void sessionClosed(IoSession session) throws Exception ;

    /**
     * session创建时。
     */
    @Override
    public abstract void sessionCreated(IoSession session) throws Exception ;

    /**
     * session超时时。
     */
    @Override
    public abstract void sessionIdle(IoSession session, IdleStatus status) throws Exception ;

    /**
     * session打开时。
     */
    @Override
    public abstract void sessionOpened(IoSession session) throws Exception ;

}