Netty斷線重連
最近使用Netty開發一個中轉服務,需要一直保持與Server端的連接,網絡中斷后需要可以自動重連,查詢官網資料,實現方案很簡單,核心思想是在channelUnregistered鈎子函數里執行重連。
創建連接
需要把configureBootstrap重構為一個函數,方便后續復用
- EventLoopGroup group = new NioEventLoopGroup();
- private volatile Bootstrap bootstrap;
-
- public void init(String host, int port) throws RobotException {
- this.serverIp = host;
- this.serverPort = port;
- try {
- // 創建並初始化 Netty 客戶端 Bootstrap 對象
- bootstrap = configureBootstrap(new Bootstrap(),group);
- bootstrap.option(ChannelOption.TCP_NODELAY, true);
- doConnect(bootstrap);
- }
- catch(Exception ex){
- ex.printStackTrace();
- throw new RobotException("connect remote control server error!",ex.getCause());
- }
- }
-
- Bootstrap configureBootstrap(Bootstrap b, EventLoopGroup g) {
- b.group(g).channel(NioSocketChannel.class)
- .remoteAddress(serverIp, serverPort)
- .handler(new ChannelInitializer<SocketChannel>() {
- @Override
- public void initChannel(SocketChannel channel) throws Exception {
- ChannelPipeline pipeline = channel.pipeline();
- // 編解碼器
- pipeline.addLast(protoCodec);
- // 請求處理
- pipeline.addLast(RobotClient.this);
- }
- });
-
- return b;
- }
-
- void doConnect(Bootstrap b) {
- try {
-
- ChannelFuture future = b.connect();
- future.addListener(new ChannelFutureListener() {
- @Override
- public void operationComplete(ChannelFuture future) throws Exception {
- if (future.isSuccess()) {
- System.out.println("Started Tcp Client: " + serverIp);
- } else {
- System.out.println("Started Tcp Client Failed: ");
- }
- if (future.cause() != null) {
- future.cause().printStackTrace();
- }
-
- }
- });
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
斷線重連
來看斷線重連的關鍵代碼:
- @ChannelHandler.Sharable
- public class RobotClient extends SimpleChannelInboundHandler<RobotProto> {
- @Override
- public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
- // 狀態重置
- isConnected = false;
- this.serverStatus = -1;
-
- final EventLoop loop = ctx.channel().eventLoop();
- loop.schedule(new Runnable() {
- @Override
- public void run() {
- doConnect(configureBootstrap(new Bootstrap(), loop));
- }
- }, 1, TimeUnit.SECONDS);
- }
- }
需要注意,Client類需要添加@ChannelHandler.Sharable注解,否則重連時會報錯
作者:Jadepeng
出處:jqpeng的技術記事本--http://www.cnblogs.com/xiaoqi
您的支持是對博主最大的鼓勵,感謝您的認真閱讀。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。