Mina客户端断线重连

原文:https://www.iteye.com/blog/chwshuang-2028951

监听器方式

新建监听器实现mina的IoServiceListener接口:

import org.apache.mina.core.service.IoService;
import org.apache.mina.core.service.IoServiceListener;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
public class IoListener implements IoServiceListener
{
    @Override
    public void serviceActivated(IoService service)
        throws Exception
    {
    }
    @Override
    public void serviceIdle(IoService service, IdleStatus idleStatus)
        throws Exception
    {
    }
    @Override
    public void serviceDeactivated(IoService service)
        throws Exception
    {
    }
    @Override
    public void sessionCreated(IoSession session)
        throws Exception
    {
    }
    @Override
    public void sessionClosed(IoSession session)
        throws Exception
    {
    }
    @Override
    public void sessionDestroyed(IoSession session)
        throws Exception
    {
    }
}

在创建客户端时加入监听:

NioSocketConnector connector = new NioSocketConnector(); // 创建连接客户端
connector.setConnectTimeoutMillis(30000); // 设置连接超时
connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
// 加入解码器
TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("GBK"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue());
factory.setDecoderMaxLineLength(10240);
factory.setEncoderMaxLineLength(10240);
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory));
connector.setDefaultRemoteAddress(new InetSocketAddress("127.0.0.1", 9999));// 设置默认访问地址
connector.setHandler(new ClientHandler());
// 加入重连监听器
connector.addListener(new IoListener()
{
    @Override
    public void sessionDestroyed(IoSession session)
        throws Exception
    {
        for (;;)
        {
            try
            {
                Thread.sleep(3000);
                ConnectFuture future = connector.connect();
                future.awaitUninterruptibly();// 等待连接创建成功
                session = future.getSession();// 获取会话
                if (session.isConnected())
                {
                    LOG.info("断线重连[" + connector.getDefaultRemoteAddress().getHostName() + ":" + connector.getDefaultRemoteAddress().getPort() + "]成功");
                    break;
                }
            }
            catch (Exception ex)
            {
                LOG.info("重连服务器登录失败,3秒再连接一次:" + ex.getMessage());
            }
        }
    }
});
// 启动时连接失败自动重连
for (;;)
{
    try
    {
        ConnectFuture future = connector.connect();
        future.awaitUninterruptibly(); // 等待连接创建成功
        @SuppressWarnings("unused")
        IoSession session = future.getSession(); // 获取会话
        LOG.info("连接服务端[成功]");
        break;
    }
    catch (RuntimeIoException e)
    {
        try
        {
            LOG.error("连接服务端[失败],5S后重新连接");
            Thread.sleep(5000);
        }
        catch (InterruptedException e1)
        {
            e1.printStackTrace();
        }
    }
}

拦截器方式

NioSocketConnector connector = new NioSocketConnector(); // 创建连接客户端
connector.setConnectTimeoutMillis(30000); // 设置连接超时
connector.getFilterChain().addFirst("reconnection", new IoFilterAdapter()
{
    @Override
    public void sessionClosed(NextFilter nextFilter, IoSession ioSession)
        throws Exception
    {
        for (;;)
        {
            try
            {
                Thread.sleep(3000);
                ConnectFuture future = connector.connect();
                future.awaitUninterruptibly();// 等待连接创建成功
                IoSession session = future.getSession();// 获取会话
                if (session.isConnected())
                {
                    LOG.info("断线重连成功");
                    break;
                }
            }
            catch (Exception ex)
            {
                LOG.info("断线重连失败,3s再次连接");
            }
        }
    }
});
connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小
connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小
TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("GBK"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue());
factory.setDecoderMaxLineLength(10240);
factory.setEncoderMaxLineLength(10240);
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(factory));
connector.setDefaultRemoteAddress(new InetSocketAddress("127.0.0.1", 9999));// 设置默认访问地址
connector.setHandler(new ClientHandler());
// 启动时连接失败自动重连
for (;;)
{
    try
    {
        ConnectFuture future = connector.connect();
        future.awaitUninterruptibly(); // 等待连接创建成功
        @SuppressWarnings("unused")
        IoSession session = future.getSession(); // 获取会话
        LOG.info("连接服务端[成功]");
        break;
    }
    catch (RuntimeIoException e)
    {
        try
        {
            LOG.error("连接服务端[失败],5S后重新连接");
            Thread.sleep(5000);
        }
        catch (InterruptedException e1)
        {
            e1.printStackTrace();
        }
    }
}
原创文章 81 获赞 49 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_34928194/article/details/105204583