Netty应用实战:客户端重连
一、什么是客户端的重连?
简单来说,当连接中断时,客户端对运行的服务端进行重新连接。
二、为什么要客户端进行重连?
就是为了防止由于网络或其他原因导致的连接中断。
三、如何实现重连?
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应用实战:客户端重连相关推荐
- 《Netty+JavaFx实战:仿桌面版微信聊天》代码开源、上云部署、视频讲解,只为让你给点个Star!
作者:小傅哥 博客:https://bugstack.cn 视频:https://mp.weixin.qq.com/s/OmXCY4fTfDpkvjlg5ME0ZA 源码:https://github ...
- netty系列之:自动重连
文章目录 简介 使用netty建立连接 自动重连接的原理 模拟自动重连 总结 简介 我们在使用客户端和服务器端连接的过程中,可能会因为各种问题导致客户端和服务器的连接发生中断,遇到这种情况,一般情况下 ...
- R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)
R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名) 目录
- netty系列之:使用netty搭建websocket客户端
文章目录 简介 浏览器客户端 netty对websocket客户端的支持 WebSocketClientHandshaker WebSocketClientCompressionHandler net ...
- Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十一)阶段性小结
Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(十一)阶段性小结 前情回顾 去年写的那一套东西,虽然我也写得非常的认真,但是其中还是有点绕了.当时水平不行.现在 ...
- Netty简单实现客户端与服务端收发消息
Netty简单实现客户端与服务端收发消息 这个小案例主要是实现netty收发消息,分为客户端,及服务端,以及包含了相关状态处理,主要的代码会放在最后 gitHub 地址上,有需要可以看一下 首先来简单 ...
- Springboot+Netty搭建UDP客户端
使用Netty+SpringBoot方式可以快速地开发一套基于UDP协议的服务端程序,同样的也可以开发客户端,一般使用UDP都是使用原生的方式,发送消息后就不管不问,也就是不需要确定消息是否收到,这里 ...
- Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述
Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述 前言 2016年,我写了一系列的 VUE 入门教程,当时写这一系列博文的时候,我也只是一个菜鸟 ...
- Netty下MQTT客户端实现
Netty下MQTT客户端实现 基于Netty对MQTT客户端的封装,代码如下: 1.客户端 public class MqttClient extends BaseClient {private ...
- Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(二)安装 nodejs 环境以及 vue-cli 构建初始项目
Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(二)安装 nodejs 环境以及 vue-cli 构建初始项目 在上一篇<Vue2+VueRouter2+ ...
最新文章
- 利用openbabel2.4.1进行小分子构象搜索
- raise主动引发异常
- [USACO1.3]牛式 Prime Cryptarithm
- HDFS--分布式文件系统
- py3+urllib+re,爬虫下载捧腹网图片
- java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解
- java经典算法(八)---zws
- 如何使用光盘启动计算机,怎么用光盘PE安装win7系统
- 船讯网|爬虫COOKIE重定向反爬处理
- Java笔记(韩顺平Java基础15-20章)
- cannot find -lGL(CentOS8 QT5.12.12)
- 如何用Python生成二维码
- js日期格式转换Wed Mar 22 13:38:37 CST 2017 转换 为yyyy-mm-dd
- 浅析防雷型TVS管的特性及应用
- mt6572 flash tool 下载报错
- 金山毒霸服务器2008系统,金山毒霸可以在服务器系统上安装吗
- 项目管理之应对客户投诉
- 业余爱好者浅谈编程 之个人经历(一)—— “万恶之源”
- Android对象封装及按汉语拼音排序
- bootstrap$核心对象数据不一致导致ORA-08102
热门文章
- 给我半首歌的时间,给你说明白Immutable List
- 2022年基础设施行业10大技术应用趋势
- 计算机科学与技术大学博士后,清华大学博士后
- 华为机试—拼音翻译成阿拉伯数字(有Wan,Qian,Bai,Shi单位)
- 2019DevFest | 从互联网前端到2B交付型前端-探索面向交付的实用前端技术栈
- vivado 基于cordic IP核的波形发生器
- pbx_functions.c:699 ast_func_write: Function DENOISE not registered
- Steven Pu:Taraxa化零为整,放大零散数据真正价值!
- 涨姿势!用深度学习LSTM炒股:对冲基金案例分析
- Weasis研究(一): IDEA启动运行Weasis3.0.4