一、什么是客户端的重连?

简单来说,当连接中断时,客户端对运行的服务端进行重新连接。

二、为什么要客户端进行重连?

就是为了防止由于网络或其他原因导致的连接中断。

三、如何实现重连?

3.1 核心思路

在bootstrap的连接方法中,使用ChannelListener监听客户端的连接状态,如果连接失败,则进行重连。

以客户端为例,简单的实现对一个IP进行重新连接,可设置重连时间,本文只解决重连方法的实现,其他的功能不再说明;

思路:将客户端的启动、连接与重连拆分为3个方法(因为要实现代码功能的原子性,可做到对客户端的状态达到原子性的控制),在bootstrap的连接方法中,使用ChannelListener实现重连机制;

3.2 实现步骤(下面都是一些伪代码思路,详细代码请看 3.3可执行代码)

1.实现客户端的启动方法;
public class Client {/** 客户端 */private EventLoopGroup eventLoopGroup;/** 存放客户端bootstrap对象 */private Bootstrap bootstrap;/** 存放客户端channel对象 */private Channel channel;/*** 启动客户端**/public void startup() {eventLoopGroup = new NioEventLoopGroup();bootstrap = new Bootstrap();bootstrap.group(eventLoopGroup).option(ChannelOption.SO_KEEPALIVE, true).channel(NioSocketChannel.class).handler(new ClientInitializer());try {// 连接服务端doConnect();} catch (Exception e) {log.warn("Connect fail." + e.getMessage());}}/*** client初始化**/class ClientInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {pipeline.addLast("requesetHander", new ClientHandler());}}
}
2.实现连接和重连方法,并在两个方法中实现ChannelListener监听器
public class Client {    /*** 连接到服务端* @throws InterruptedException 中断异常*/public void doConnect() throws InterruptedException {log.debug("Start connecting server");if (channel != null && channel.isActive()) {return;}bootstrap.connect(serverAddr, port).addListener(new ChannelListener()).sync().channel();}/*** 重新连接* @param serverIp 连接的IP**/private void reConnect() {try {log.debug("Start reconnect to server." + serverIp + ":" + port);if (channel != null && channel.isOpen()) {if (log.isDebugEnabled()) {log.debug(String.format("server [%s] channel is active, close it and reconnect", serverIp));}channel.close();}bootstrap.connect(new InetSocketAddress(serverIp, port)).addListener(new ChannelListener()).sync().channel();} catch (Exception e) {log.warn("ReConnect to server failure.server=" + serverIp + ":" + port + ":" + e.getMessage());}}
}
3.创建业务handler处理器类
/*** 业务handler分发日志,任务等**/class ClientHandler extends SimpleChannelInboundHandler<LogMsg> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, LogMsg request) throws Exception {}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {log.info(String.format("the client connect to server=%s, local=%s",ctx.channel().remoteAddress(), ctx.channel().localAddress()));}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {ctx.close();}}
4.实现客户端第一次连接服务端失败时的重连ChannelListener;
    /*** ChannelFutureListener* @author zhangyang**/private class ChannelListener implements ChannelFutureListener {// 该方法会在channelActive之前执行,去判断客户端连接是否成功,并做失败重连的操作@Overridepublic void operationComplete(ChannelFuture future) throws Exception {// 连接成功后保存Channelif (future.isSuccess()) {channel = future.channel();SocketAddress sa = channel.remoteAddress();connectedServerAddr = ((InetSocketAddress) sa).getAddress().getHostAddress();log.info("Connect success " + connectedServerAddr + ":" + port);} else {// 失败后delaySecond秒(默认是5秒)重连,周期性delaySecond秒的重连;future.channel().eventLoop().schedule(new Runnable() {@Overridepublic void run() {// 进行重连reConnect(serverIp);}}, delaySeconds, TimeUnit.SECONDS);}}}
5.实现连接中断channelInactive的重连(即连接成功之后,由于网络中断等其他原因,进行重连)

在业务handler处理器类的channelInactive方法中进行重连;

/*** 业务handler分发日志,任务等**/class ClientHandler extends SimpleChannelInboundHandler<LogMsg> {@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {ctx.close();TimeUnit.SECONDS.sleep(delaySeconds);// 重连reConnect(serverIp);}// 注意:发生异常不需要进行重连@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {log.error(String.format("Remote service [%s] has exception.", ctx.channel().remoteAddress()), cause);ctx.close();}}

Netty应用实战:客户端重连相关推荐

  1. 《Netty+JavaFx实战:仿桌面版微信聊天》代码开源、上云部署、视频讲解,只为让你给点个Star!

    作者:小傅哥 博客:https://bugstack.cn 视频:https://mp.weixin.qq.com/s/OmXCY4fTfDpkvjlg5ME0ZA 源码:https://github ...

  2. netty系列之:自动重连

    文章目录 简介 使用netty建立连接 自动重连接的原理 模拟自动重连 总结 简介 我们在使用客户端和服务器端连接的过程中,可能会因为各种问题导致客户端和服务器的连接发生中断,遇到这种情况,一般情况下 ...

  3. R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)

    R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名) 目录

  4. netty系列之:使用netty搭建websocket客户端

    文章目录 简介 浏览器客户端 netty对websocket客户端的支持 WebSocketClientHandshaker WebSocketClientCompressionHandler net ...

  5. Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十一)阶段性小结

    Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十一)阶段性小结 前情回顾 去年写的那一套东西,虽然我也写得非常的认真,但是其中还是有点绕了.当时水平不行.现在 ...

  6. Netty简单实现客户端与服务端收发消息

    Netty简单实现客户端与服务端收发消息 这个小案例主要是实现netty收发消息,分为客户端,及服务端,以及包含了相关状态处理,主要的代码会放在最后 gitHub 地址上,有需要可以看一下 首先来简单 ...

  7. Springboot+Netty搭建UDP客户端

    使用Netty+SpringBoot方式可以快速地开发一套基于UDP协议的服务端程序,同样的也可以开发客户端,一般使用UDP都是使用原生的方式,发送消息后就不管不问,也就是不需要确定消息是否收到,这里 ...

  8. Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述

    Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述 前言 2016年,我写了一系列的 VUE 入门教程,当时写这一系列博文的时候,我也只是一个菜鸟 ...

  9. Netty下MQTT客户端实现

    Netty下MQTT客户端实现 基于Netty对MQTT客户端的封装,代码如下:  1.客户端 public class MqttClient extends BaseClient {private ...

  10. Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(二)安装 nodejs 环境以及 vue-cli 构建初始项目

    Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(二)安装 nodejs 环境以及 vue-cli 构建初始项目 在上一篇<Vue2+VueRouter2+ ...

最新文章

  1. 利用openbabel2.4.1进行小分子构象搜索
  2. raise主动引发异常
  3. [USACO1.3]牛式 Prime Cryptarithm
  4. HDFS--分布式文件系统
  5. py3+urllib+re,爬虫下载捧腹网图片
  6. java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解
  7. java经典算法(八)---zws
  8. 如何使用光盘启动计算机,怎么用光盘PE安装win7系统
  9. 船讯网|爬虫COOKIE重定向反爬处理
  10. Java笔记(韩顺平Java基础15-20章)
  11. cannot find -lGL(CentOS8 QT5.12.12)
  12. 如何用Python生成二维码
  13. js日期格式转换Wed Mar 22 13:38:37 CST 2017 转换 为yyyy-mm-dd
  14. 浅析防雷型TVS管的特性及应用
  15. mt6572 flash tool 下载报错
  16. 金山毒霸服务器2008系统,金山毒霸可以在服务器系统上安装吗
  17. 项目管理之应对客户投诉
  18. 业余爱好者浅谈编程 之个人经历(一)—— “万恶之源”
  19. Android对象封装及按汉语拼音排序
  20. bootstrap$核心对象数据不一致导致ORA-08102

热门文章

  1. 给我半首歌的时间,给你说明白Immutable List
  2. 2022年基础设施行业10大技术应用趋势
  3. 计算机科学与技术大学博士后,清华大学博士后
  4. 华为机试—拼音翻译成阿拉伯数字(有Wan,Qian,Bai,Shi单位)
  5. 2019DevFest | 从互联网前端到2B交付型前端-探索面向交付的实用前端技术栈
  6. vivado 基于cordic IP核的波形发生器
  7. pbx_functions.c:699 ast_func_write: Function DENOISE not registered
  8. Steven Pu:Taraxa化零为整,放大零散数据真正价值!
  9. 涨姿势!用深度学习LSTM炒股:对冲基金案例分析
  10. Weasis研究(一): IDEA启动运行Weasis3.0.4