原文: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();
}
}
}