问题

最近使用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相关推荐

  1. 关于tcp断线重连的问题

    在工控上经常用到tcp连接,比如串口服务器或某些支持modbustcp协议的仪表等,以前尽量使用串口服务器的虚拟串口功能,现在逐步使用上了tcpserver或tcpclient模式. 搜索了个C++ ...

  2. tcp 重连 java,TCP断线重连机制

    断线重连机制 [java] view plain copy /** * 断线重连机制 * Created by fflin on 2016/5/8. */ public class Reconnect ...

  3. lwip的tcp断线重连例程_STM32F107+LWIP---如何检查tcp通讯断开?并重新连接

    void LwIP_Init(void) { struct ip_addr ipaddr;        //IP地址 struct ip_addr netmask;        //子掩码 str ...

  4. Netty是如何实现TCP心跳机制与断线重连的

    本文来说下Netty 是如何实现 TCP 心跳机制与断线重连的 文章目录 什么是心跳机制HeartBeat 如何实现心跳机制 Netty实现自定义的心跳机制 服务端 客户端 测试效果 客户端断线重连 ...

  5. Socket网络编程tcp聊天案例(心跳包,多线程,断线重连机制)

    实现一个聊天的案例,使用多线程和心跳包.当服务器断开的时候,客户端会自动尝试重新连接,当服务器开启的时候,客户端会自动连接 Server服务器类 package Demo3_Chat;import c ...

  6. Labview 编写TCP/IP 客户端断线重连机制程序,亲测可用

    程序面板如下图: 此程序支持任意一方断线重连机制,仅供大家参考! 实际工程中,如果出现服务器出现宕机,那么我们的客户端要有重连的机制,不然软件不会自动连接服务器,明显是我们程序编写的一个漏洞,无论是从 ...

  7. 面试官问:服务的心跳机制与断线重连,Netty底层是怎么实现的?懵了

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, ...

  8. Netty实现心跳机制与断线重连

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...

  9. 用Netty撸一个心跳机制和断线重连!

    来源:www.jianshu.com/p/1a28e48edd92 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确 ...

  10. 服务的心跳机制与断线重连,Netty底层是怎么实现的?

    作者:sprinkle_liz www.jianshu.com/p/1a28e48edd92 提醒:本篇适合有一定netty基础的读者阅读 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客 ...

最新文章

  1. java smtp 内嵌图片,SMTP 发送内嵌图片 邮件
  2. java tcp 三次握手_用Java代码分析TCP的三次握手四次挥手过程
  3. android 判断横竖屏的方法
  4. linux平台 一个简单的helloworld静态库的制作与使用
  5. 中国非动物胶市场来产销需求及发展潜力研究报告2022版
  6. 收银机多少钱一台推荐科脉系统_防火门监控系统安装预算多少钱?防火门监控系统安装预算表[今日推荐]...
  7. java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一
  8. leetcode 53 python 动态规划
  9. 【华为云技术分享】8种ETL算法汇总大全!看完你就全明白了
  10. 解封装(六):通过遍历获取AVStream音视频流信息并打印参数
  11. 安装Google服务包
  12. MOTU Digital Performer 11.0 WiN 老牌音乐制作宿主软件
  13. 安卓10不支持qmc解码_你永远都不知道手机中计算器的秘密!安卓IOS都支持!
  14. 基于ARM处理器的U-BOOT详细移植总结
  15. Android Studio开发手机APP(二)-利用MQTT通信开发物联网程序
  16. MySQL轻快入门2021.3.18(事务)
  17. 实时游戏对战引擎MatchVS,我的对战旅程
  18. 从0到1快速了解netty长连接网关协议
  19. python爬虫——百度贴吧图片爬取 小项目
  20. NYOJ 489-哭泣天使:最大流

热门文章

  1. dataset中shuffle()、repeat()、batch()用法
  2. 《CSS揭秘》实用技巧总结
  3. 0行代码,实现植物大战僵尸脚本
  4. vue-3d-model vue 实现3D 图像显示
  5. UGUI_03_补充之_Image的属性(image type这个属性simple、Sliced、tiled、filled样式详解)
  6. Rails Controller中的concerns测试编写
  7. 视频转换格式 qlv 转 mp4 详解
  8. 上井冲刺港交所上市:人均消费金额降幅明显,只在中国经营业务
  9. 彻底理解原型对象与原型链机制
  10. matlab怎么栅格化地图,用栅格化的思维进行地图散点数据绘制