900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > netty 服务端断开连接后重新连接

netty 服务端断开连接后重新连接

时间:2024-03-23 11:31:39

相关推荐

netty 服务端断开连接后重新连接

问题

刚开始使用netty,并未考虑服务端网络问题,但是今天发现有几次出现客户端发送成功,但是服务端未收到消息的情况,这才开始考虑客户端重连问题。

方案

netty本身提供断开连接通知,客户端需要在收到通知后,编写代码进行重新连接即可。

步骤

自定义处理类NettyClientHandler继承ChannelInboundHandlerAdapter,实现其方法,如下图:

@Overridepublic void channelInactive(ChannelHandlerContext ctx){logger.error("掉线了...");logger.error("channelInactive:{}", ctx.channel().localAddress());try{super.channelInactive(ctx);nettyClient.connectAsync();logger.error("重连完成");}catch (Exception e){logger.error("重连失败:{}", ExceptionUtils.getStackTrace(e));}}

2.connectAsync方法实现真正的重连:

public void connectAsync() {logger.error("尝试连接到服务端: {}:{}",host,port);try {ChannelFuture channelFuture = bootstrap.connect(host, port);channelFuture.addListener((ChannelFutureListener) future -> {if (!future.isSuccess()) {logger.error("等待下一次重连");ScheduledFuture scheduledFuture = null;try{scheduledFuture=future.channel().eventLoop().schedule(() -> {logger.error("scheduler------------------start");connectAsync();logger.error("scheduler------------------end");}, 1, TimeUnit.SECONDS);logger.error("end:{}",scheduledFuture.isDone());}catch (Exception e){logger.error("error:{}",ExceptionUtils.getStackTrace(e));}} else {logger.error("Netty client started !!! {} connect to server", channel.localAddress());channel = future.channel();}});}catch (Exception e){logger.error("重连出错:{}",ExceptionUtils.getStackTrace(e));}}

netty都是异步操作,连接之后,需要添加监听,在监听内部获取是否连接成功的通知,如果失败,则使用异步的线程重新执行该方法,直到成功;成功则直接退出。

问题

目前,还未考虑:在重连的过程中,客户端还是未发送消息给服务端,需要在发现断开连接之后,则停止消息发送,直到连接成功!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。