Mina重连

import com.sun.swing.internal.plaf.metal.resources.metal;
import com.sun.swing.internal.plaf.metal.resources.metal_sv;
import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
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.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import java.net.ConnectException;
import java.net.InetSocketAddress;

public class MinaClient {
    public SocketConnector socketConnector;

    public static final int DEFAULT_CONNECT_TIMEOUT = 5;

    public static final String HOST = ”192.168.0.100″;

    public static final int PORT = 1100;

    public static IoSession ioSession;

    public MinaClient() {
        init();
    }

    public void init() {
        socketConnector = new NioSocketConnector();

        // 
        socketConnector.getSessionConfig().setKeepAlive(true);

        socketConnector.setConnectTimeoutMillis(DEFAULT_CONNECT_TIMEOUT * 1000);

        socketConnector.getFilterChain().addLast(“codec”, new ProtocolCodecFilter(new TextLineCodecFactory()));

        ClientIoHandler ioHandler = new ClientIoHandler();
        socketConnector.setHandler(ioHandler);
        InetSocketAddress addr = new InetSocketAddress(HOST, PORT);
        ConnectFuture cf = socketConnector.connect(addr);
        cf.awaitUninterruptibly();
        ioSession = cf.getSession();
    }

    public void sendMessage(final String msg) {
        try {
            if (ioSession != null) {
                if (ioSession.isConnected()) {//
                    ioSession.write(msg);//
                    System.out.println(“send message ” + msg);
                } else {
                    reconnect();
                }
            }

        } catch (RuntimeIoException e) {
            e.printStackTrace();
        }
    }

    private void reconnect() {
        InetSocketAddress addr = new InetSocketAddress(HOST, PORT);
        ConnectFuture cf = socketConnector.connect(addr);
        cf.awaitUninterruptibly();
        ioSession = cf.getSession();
    }

    public static void main(String[] args) throws InterruptedException {
        MinaClient clent = new MinaClient();
        for (int i = 0; i < 99999; i++) {
            Thread.sleep(2000);
            System.err.println(i);
            clent.sendMessage(“Hello World ” + i);
        }
        clent.getSocketConnector().dispose();

    }

    public SocketConnector getSocketConnector() {
        return socketConnector;
    }

    public void setSocketConnector(SocketConnector socketConnector) {
        this.socketConnector = socketConnector;
    }

}

class ClientIoHandler extends IoHandlerAdapter {

    private void releaseSession(IoSession session) throws Exception {
        System.out.println(“releaseSession”);
        if (session.isConnected()) {
            session.close(true);
        }
    }

    @Override
    public void sessionOpened(IoSession session) throws Exception {
        System.out.println(“sessionOpened”);
    }

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println(“sessionClosed-c”);
    }

    @Override
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        System.out.println(“sessionIdle”);
        try {
            releaseSession(session);
        } catch (RuntimeIoException e) {
        }
    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        System.out.println(“Receive Server message ” + message);

    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        System.out.println(“exceptionCaught”);
        cause.printStackTrace();
        releaseSession(session);
    }

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        System.out.println(“messageSent”);
        super.messageSent(session, message);
    }

}
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import java.net.InetSocketAddress;

public class MinaServer {

    public void init() throws Exception{
        SocketAcceptor acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors() + 1);
        //设置解析器
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));

        acceptor.setHandler(new BexnHandler());
        acceptor.bind(new InetSocketAddress(1100));
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,5);

    }
    public MinaServer() throws Exception {
        init();
    }

    public static void main(String[] args) throws Exception {
        new MinaServer();
        System.out.println("Server start");
    }
}

class BexnHandler extends IoHandlerAdapter {
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        System.out.println("messageReceived " + message);
        super.messageReceived(session, message);
        session.write("messageReceived "+message);

    }

    @Override
    public void exceptionCaught(IoSession session, Throwable cause)
            throws Exception {
        if (session.isConnected()) {
            session.close(true);
        }
    }

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

    @Override
    public void sessionClosed(IoSession session) throws Exception {
        super.sessionClosed(session);
        System.out.println("sessionClosed-s");
    }

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

    @Override
    public void sessionIdle(IoSession session, IdleStatus status)
            throws Exception {
        session.close(true);
    }

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

猜你喜欢

转载自caizhenyao.iteye.com/blog/2071841
今日推荐