public class KeepAliveDaemon
extends java.lang.Object
Keep alive的目的有2个:
1、防止NAT路由算法导致的端口老化:
路由器的NAT路由算法存在所谓的“端口老化”概念
(理论上NAT算法中UDP端口老化时间为300S,但这不是标准,而且中高端路由器
可由网络管理员自行设定此值),Keep alive机制可确保在端口老化时间到来前
重置老化时间,进而实现端口“保活”的目的,否则端口老化导致的后果是服务器
将向客户端发送的数据将被路由器抛弃。
2、即时探测由于网络状态的变动而导致的通信中断(进而自动触发自动治愈机制):
此种情况可的原因有(但不限于):无线网络信号不稳定、WiFi与2G/3G/4G等同开情
况下的网络切换、手机系统的省电策略等。
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
限定符和类型 | 字段和说明 |
---|---|
static int |
KEEP_ALIVE_INTERVAL
Keep Alive 心跳时间间隔(单位:毫秒),默认3000毫秒.
|
static int |
NETWORK_CONNECTION_TIME_OUT
收到服务端响应心跳包的超时间时间(单位:毫秒),默认(3000 * 3 + 1000)= 10000 毫秒.
|
限定符和类型 | 方法和说明 |
---|---|
static KeepAliveDaemon |
getInstance() |
boolean |
isKeepAliveRunning()
线程是否正在运行中。
|
void |
run() |
void |
setNetworkConnectionLostObserver(java.util.Observer networkConnectionLostObserver)
设置网络断开事件观察者.
|
void |
start(boolean immediately)
启动线程。
|
void |
stop()
无条件中断本线程的运行。
|
void |
updateGetKeepAliveResponseFromServerTimstamp()
收到服务端反馈的心跳包时调用此方法:作用是更新服务端最背后的响应时间戳.
|
public static int NETWORK_CONNECTION_TIME_OUT
超过这个时间客户端将判定与服务端的网络连接已断开(此间隔建议为(KEEP_ALIVE_INTERVAL * 3) + 1 秒), 没有上限,但不可太长,否则将不能即时反映出与服务器端的连接断开(比如掉掉线时),请从 能忍受的反应时长和即时性上做出权衡。
本参数除与KEEP_ALIVE_INTERVAL
有关联外,不受其它设置影响。
public static int KEEP_ALIVE_INTERVAL
心跳间隔越短则保持会话活性的健康度更佳,但将使得在大量客户端连接情况下服务端因此而增加负载, 且手机将消耗更多电量和流量,所以此间隔需要权衡(建议为:>=1秒 且 < 300秒)!
说明:此参数用于设定客户端发送到服务端的心跳间隔,心跳包的作用是用来保持与服务端的会话活性( 更准确的说是为了避免客户端因路由器的NAT算法而导致UDP端口老化).
参定此参数的同时,也需要相应设置服务端的ServerLauncher.SESION_RECYCLER_EXPIRE参数。
public static KeepAliveDaemon getInstance()
public void run()
public void stop()
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
public void start(boolean immediately)
无论本方法调用前线程是否已经在运行中,都会尝试首先调用 stop()
方法,
以便确保线程被启动前是真正处于停止状态,这也意味着可无害调用本方法。
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
immediately
- true表示立即执行线程作业,否则直到 #AUTO_RE$LOGIN_INTERVAL
执行间隔的到来才进行首次作业的执行public boolean isKeepAliveRunning()
public void updateGetKeepAliveResponseFromServerTimstamp()
本方法的调用,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
public void setNetworkConnectionLostObserver(java.util.Observer networkConnectionLostObserver)
本方法的调用,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
networkConnectionLostObserver
-