1. 程式人生 > >java 心跳機制

java 心跳機制

自己 查看 異常 定義 bsp 不存在 serve 時間段 部分

心跳機制:就是每隔幾分鐘發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。

心跳包

心跳包就是在客戶端和服務器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
  用來判斷對方(設備,進程或其它網元)是否正常運行,采用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經離線。用於檢測TCP的異常斷開。基本原因是服務器端不能有效的判斷客戶端是否在線,也就是說,服務器無法區分客戶端是長時間在空閑,還是已經掉線的情況。所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。

  比如有些通信軟件長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理,一般是客戶端。服務器也可以定時發心跳下去。一般來說,出於效率的考慮,是由客戶端主動向服務器端發包,而不是服務器向客戶端發。客戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,服務器收到後,就知道當前客戶端還處於“活著”的狀態,否則,如果隔一定時間未收到這樣的包,則服務器認為客戶端已經斷開,進行相應的客戶端斷開邏輯處理。

服務器實現心跳機制的兩種策略

大部分CS的應用需要心跳機制。心跳機制一般在Server和Client都要實現,兩者實現原理基本一樣。Client不關心性能,怎麽做都行。

如果應用是基於TCP的,可以簡單地通過SO_KEEPALIVE實現心跳。TCP在設置的KeepAlive定時器到達時向對端發一個檢測TCP segment,如果沒收到ACK或RST,嘗試幾次後,就認為對端已經不存在,最後通知應用程序。這裏有個缺點是,Server主動發出檢測包,對性能有點影響。

應用自己實現

Client啟動一個定時器,不斷發心跳;

Server收到心跳後,給個回應;

Server啟動一個定時器,判斷Client是否存在,判斷方法這裏列兩種:時間差和簡單標誌。

1. 時間差策略

收到一個心跳後,記錄當前時間(記為recvedTime)。

判斷定時器時間到達,計算多久沒收到心跳的時間(T)=當前時間 - recvedTime(上面記錄的時間)。如果T大於某個設定值,就可以認為Client超時了。

2. 簡單標誌

收到一個心跳後,設置連接標誌為true;

判斷定時器時間到達,查看所有的標誌,false的,認為對端超時了;true的將其設成false。

上面這種方法比上面簡單一些,但檢測某個Client是否離線的誤差有點大。

java 心跳機制