public class ReconnectTimer extends TimerTask {
@Override
public void run() {
System.out.println("正在尝试与服务器连接......");
try {
new TelnetClient("192.168.0.107", 9090).run();
System.out.println("与服务器断开连接,尝试10秒后与服务器重新连接......");
} catch (Exception e) {
System.out.println("无法连接到服务器,尝试10秒后与服务器重新连接......");
return;
}
}
public static void main(String[] args) throws Exception {
Timer clientTimer = new Timer("Client Reconnect Timer");// 创建定时器
clientTimer.schedule(new ReconnectTimer(), 0, 10 * 1000);// 开启断线重连定时器
}
}
这是netty客户端重连服务端代码,下面是netty服务端代码
try {标红的地方应该是客户端连接断开的时候,代码就会往下走,反之,就阻塞在这里。
我设想这样的场景,如果服务端压根没有启动的话,直接运行客户端,其运行结果如下:
无法连接到服务器,尝试10秒后与服务器重新连接......
正在尝试与服务器连接......
无法连接到服务器,尝试10秒后与服务器重新连接......
正在尝试与服务器连接......
无法连接到服务器,尝试10秒后与服务器重新连接......
正在尝试与服务器连接......
无法连接到服务器,尝试10秒后与服务器重新连接......
正在尝试与服务器连接......
但是,如果,我一开始就把netty服务端启动后,再运行客户端后,客户端自然会连上服务端,这个时候,我再把netty服务端给关闭掉,却发现客户端报错
警告: Unexpected exception from downstream.
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
此后,客户端不再执行定时任务了,按照我的设想,这个时候,应该会继续执行定时器任务的,为什么不执行定时器任务呢?
IOException是uncheckedexception
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程定时任务现在推荐用ScheduledExecutorService TelnetClient这边没有处理exception,你可以overrideexceptionCaught方法 //客户端重启
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。