
java是可以实现心跳的程序的。
心跳顾名思义就是每隔一段时间执行,或者轮询查询状态,可以使用timer来实现,代码如下:
定时器可以实现//1000毫秒,固定时间,每隔1秒钟执行一次actionPerformed方法
javax.swing.Timer clock = new javax.swing.Timer(1000,new ActionListener(){
public void actionPerformed(ActionEvent e) {
//执行心跳方法
/**...*/
//调用其他方法
/**...*/
}
})
clock.start()
可以独立用个线程管理,也可以直接写在主线程中
心跳包是按一定周期发送的包,用来检测TCP连接是否正常。心跳包工作逻辑如下:1)TCP Listener(服务器端)侦听TCP Client(客户端)端的连接请求。一旦TCP Listener接受了客户端的请求,即启动一个定时器。定时器按约定的时间间隔T向客户端发送心跳包
2)客户端在连接建立后,也启动一个定时器,这个定时器定时间隔同样为T。当客户端收到心跳包后,将一个计数变量清零;在客户端定时器的事件处理方法中将这个计数变量增加1。同时检查计数变量的值。如果这个计数值大于某个数(比如2),这表示在2×T段时间内没有收到心跳包,即可以断定TCP连接出现问题。这时,客户端可以主动断开连接,然后再次请求连接服务器端。
----------------
心跳包处理过程与是否采用异步收发没有关系,也就是说,无论是同步方式还是异步方式都可以用上述心跳包处理逻辑
通过 长时间保持双方连接 ,从而:
下面,我将对每种原因进行分析
当进程被杀死后,长连接也会随之断开
当移动客户端网络状态发生变化时(如移动网络 &Wifi切换、断开、重连),也会使长连接断开
如网络状态差、 DHCP 的租期到期等等,都会使得长连接发生 偶然的断开
其实,说得简单点: 高效维持长连接的关键在于
整体概括如下:
这是本文的重点,下节开始会详细解析
对国、内外主流的移动 IM 产品( WhatsApp 、 Line 、微信)进行了心跳机制的简单分析 &对比,具体请看下图
下面,将根据市面上主流的心跳机制,设计 一套心跳机制方案
在下面的方案设计中,将针对这3个问题给出详细的解决方案。
为了减少流量 &提高发送效率,需要精简心跳包的设计
主要从心跳包的内容 &大小入手,设计原则具体如下
心跳包 = 1个 携带少量信息 & 大小在10字节内 的信息包
为了 防止 NAT 超时 &减少设备资源的消耗(网络流量、电量、CPU等等), 心跳发送的间隔时间 是 整个 心跳机制方案设计的重点。
心跳发送间隔时间的设计原则如下
下面,我将详细讲解 自适应心跳间隔时间 的设计方案
1.如何自适应计算心跳间隔 从而使得心跳间隔 接近 当前 NAT 超时时间?
注:只有当心跳间隔 接近 NAT 超时时间 时, 才能最大化平衡 长连接不中断 &设备资源消耗最低的问题 。
2.如何检测 当前网络环境的 NAT 超时时间 发生了变化 ?
注:在检测到 NAT 超时时间 发生变化后,重新自适应计算心跳间隔 从而使得心跳间隔 接近 NAT 超时时间
该机制的核心在于, 如何 判断长连接的有效性
在网上流传着一些用于判断长连接是否有效的方案,具体介绍如下
至此,关于心跳保活机制已经讲解完毕。
很多人认为, TCP 协议自身就有 KeepAlive 机制,为何基于它的通讯链接,仍需 在应用层实现额外的心跳保活机制 ?
先来看看 KeepAlive 机制 是什么
KeepAlive 的机制 不可 替代心跳机制 的具体原因如下:
KeepAlive 机制无法代替心跳机制, 需要在应用层 自己实现心跳机制以检测长连接的有效性,从而高效维持长连接
不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)