Netty断线重连
时间:2022-05-04
本文章向大家介绍Netty断线重连,主要内容包括Netty断线重连、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
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);
}
}
- 带三方登录(qq,微信,微博)
- Android Studio移动鼠标显示悬浮提示的设置方法
- Spring Cloud构建微服务架构:服务注册与发现
- 自定义Interpolator
- 解决adb push时出现的"Read-only file system"问题
- 1个掷硬币问题,4个Python解法
- 用xml来编写动画
- VIM常见用法总结
- Spring Cloud构建微服务架构:服务消费者
- android微信登录,分享
- 注册会计师带你用Python进行探索性风险分析(二)
- Android监听自身卸载,弹出用户反馈调查
- Spring Boot 1.5.x新特性:动态修改日志级别
- XMPP客户端库Smack 4.0.6版开发之二
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SQL-显示供应商供应零件的汇总列表(with rollup+coalesce)
- 浙大版《C语言程序设计(第3版)》题目集 习题8-8 判断回文字符串
- 双向广搜-HDU1401 Solitaire
- TCP三次握手和四次挥手以及11种状态
- 浙大版《C语言程序设计(第3版)》题目集 题8-9 分类统计各类字符个数
- 迭代加深搜索-POJ 3134 Power Calculus
- 浙大版《C语言程序设计(第3版)》题目集 习题9-2 计算两个复数之积
- 浙大版《C语言程序设计(第3版)》题目集 习题9-6 按等级统计学生成绩
- 实战|用pandas+PyQt5制作一款数据分组透视处理工具
- 带权/种类并查集-POJ 1182食物链
- 浙大版《C语言程序设计(第3版)》题目集 练习10-1 使用递归函数计算1到n之和
- 十分钟快速了解Pandas的常用操作!
- 一行代码如何隐藏 Linux 进程?
- SSH 只能用于远程 Linux 主机?那说明你见识太小了!
- 干货 | Trip.com 机票React Native整洁架构2.0实践