0920-TCP断线重连 reconnect
问题
最近使用AD域LDAP通信碰到一个TCP底层问题,一个链接第一次点击失败,再点击就正常;
过一段时间又会出现这一情况;
跟踪日志发现:The connection is not established
定位问题:连接是有的,但是没有保活(自行百度)
建立连接后,过了很久连接中断,但是客户端没有收到服务端的信息,认为是有效连接,尝试连接时会报错
解决办法
1 客户端和服务端设置保活
理论上,下一个心跳周期前连接断了,还是会有这个问题
//TCP保活 超时时间options.setUseKeepAlive(true);options.setConnectTimeoutMillis(CONNECT_TIMEOUT);options.setResponseTimeoutMillis(RESPONSE_TIMEOUT);connection = new LDAPConnection(sslSocketFactory,options,adIpAddress,adDef.getAdPort(),adminDN,adDef.getAdAdminPassword());connectionPool = new LDAPConnectionPool(connection, adDef.getAdMaxPoolCount());
2 断线重连机制(根本解决)
在发起业务请求前,先发起一个请求检测是否有效,
如果无效会抛出异常,catch异常尝试重连 ,如果超过重试次数抛出异常
//发请求前,随意发起一个状态请求(任何内容,尽可能小),如果抛异常则尝试重连
checkAndReconnect(ldapConnection);
//发起真正的业务请求
modResult = ldapConnection.modify(adUser.getUserDN(), mods);
/*** 检查连接并重试* @param connection LDAP连接*/private static void checkAndReconnect(LDAPConnection connection){Preconditions.checkNotNull(connection, LOG_PREFIX+"空连接,请检查网络");try {connection.getRootDSE();} catch (LDAPException e) {int i;for (i = 0; i < RECONNECT_TIMES; i++) {try {connection.reconnect();log.info(LOG_PREFIX+"重连..{} 成功",i+1);return;} catch (LDAPException e1) {log.info(LOG_PREFIX+"重连..{} 失败{}",i+1,e.getResultString());}}throw Exceptions.newBusinessException(LOG_PREFIX+"重连"+i+"次失败,网络可能已经断开");}}
测试
模拟网络断开
Windows防火墙模拟网络断开
开发机是windows,使用防火墙屏蔽端口,出战规则屏蔽端口,启动规则,模拟连接突然断开
Linux防火墙模拟网络断开
//打开防火墙配置文件
vim /etc/sysconfig/iptables
//iptables添加屏蔽规则
-A OUTPUT -p tcp --dport 23000 -j DROP
//重启iptables使规则生效
systemctl restart iptables
//telnet模拟防火墙是否生效
telnet 192.168.1.17 23000
测试成功(中间开启屏蔽规则,放开后连接成功)
心得体会
不能通过状态检测来确认连接是否正常
比如不能以isConnected()的结果作为是否连接的标准,它只是一个结果
连接本质上是一个对象,所谓的状态只是一个成员变量,可能网络断了,但状态还是之前正常连接的状态
通过尝试连接是否抛异常来判断连接状态及尝试重连
所以简单来说,就是要看方法是否抛异常,如果抛异常,那么它底层的确是去连接了,所以才知道状态
- 通过防火墙模拟网络连接
- debug模式可以在需要的时候才打断点,不需要提前打断点
0920-TCP断线重连 reconnect相关推荐
- 关于tcp断线重连的问题
在工控上经常用到tcp连接,比如串口服务器或某些支持modbustcp协议的仪表等,以前尽量使用串口服务器的虚拟串口功能,现在逐步使用上了tcpserver或tcpclient模式. 搜索了个C++ ...
- tcp 重连 java,TCP断线重连机制
断线重连机制 [java] view plain copy /** * 断线重连机制 * Created by fflin on 2016/5/8. */ public class Reconnect ...
- lwip的tcp断线重连例程_STM32F107+LWIP---如何检查tcp通讯断开?并重新连接
void LwIP_Init(void) { struct ip_addr ipaddr; //IP地址 struct ip_addr netmask; //子掩码 str ...
- Netty是如何实现TCP心跳机制与断线重连的
本文来说下Netty 是如何实现 TCP 心跳机制与断线重连的 文章目录 什么是心跳机制HeartBeat 如何实现心跳机制 Netty实现自定义的心跳机制 服务端 客户端 测试效果 客户端断线重连 ...
- Socket网络编程tcp聊天案例(心跳包,多线程,断线重连机制)
实现一个聊天的案例,使用多线程和心跳包.当服务器断开的时候,客户端会自动尝试重新连接,当服务器开启的时候,客户端会自动连接 Server服务器类 package Demo3_Chat;import c ...
- Labview 编写TCP/IP 客户端断线重连机制程序,亲测可用
程序面板如下图: 此程序支持任意一方断线重连机制,仅供大家参考! 实际工程中,如果出现服务器出现宕机,那么我们的客户端要有重连的机制,不然软件不会自动连接服务器,明显是我们程序编写的一个漏洞,无论是从 ...
- 面试官问:服务的心跳机制与断线重连,Netty底层是怎么实现的?懵了
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, ...
- Netty实现心跳机制与断线重连
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...
- 用Netty撸一个心跳机制和断线重连!
来源:www.jianshu.com/p/1a28e48edd92 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确 ...
- 服务的心跳机制与断线重连,Netty底层是怎么实现的?
作者:sprinkle_liz www.jianshu.com/p/1a28e48edd92 提醒:本篇适合有一定netty基础的读者阅读 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客 ...
最新文章
- java smtp 内嵌图片,SMTP 发送内嵌图片 邮件
- java tcp 三次握手_用Java代码分析TCP的三次握手四次挥手过程
- android 判断横竖屏的方法
- linux平台 一个简单的helloworld静态库的制作与使用
- 中国非动物胶市场来产销需求及发展潜力研究报告2022版
- 收银机多少钱一台推荐科脉系统_防火门监控系统安装预算多少钱?防火门监控系统安装预算表[今日推荐]...
- java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一
- leetcode 53 python 动态规划
- 【华为云技术分享】8种ETL算法汇总大全!看完你就全明白了
- 解封装(六):通过遍历获取AVStream音视频流信息并打印参数
- 安装Google服务包
- MOTU Digital Performer 11.0 WiN 老牌音乐制作宿主软件
- 安卓10不支持qmc解码_你永远都不知道手机中计算器的秘密!安卓IOS都支持!
- 基于ARM处理器的U-BOOT详细移植总结
- Android Studio开发手机APP(二)-利用MQTT通信开发物联网程序
- MySQL轻快入门2021.3.18(事务)
- 实时游戏对战引擎MatchVS,我的对战旅程
- 从0到1快速了解netty长连接网关协议
- python爬虫——百度贴吧图片爬取 小项目
- NYOJ 489-哭泣天使:最大流
热门文章
- dataset中shuffle()、repeat()、batch()用法
- 《CSS揭秘》实用技巧总结
- 0行代码,实现植物大战僵尸脚本
- vue-3d-model vue 实现3D 图像显示
- UGUI_03_补充之_Image的属性(image type这个属性simple、Sliced、tiled、filled样式详解)
- Rails Controller中的concerns测试编写
- 视频转换格式 qlv 转 mp4 详解
- 上井冲刺港交所上市:人均消费金额降幅明显,只在中国经营业务
- 彻底理解原型对象与原型链机制
- matlab怎么栅格化地图,用栅格化的思维进行地图散点数据绘制