心跳包 告訴別人,我還活著

2022-05-17 16:34:14 字數 1970 閱讀 1431

心跳一般是指客戶端(也可以是伺服器端)向對方每隔一段時間傳送乙個應用層的自定義指令,以確保連線的有效性。因為是固定間隔,同時是檢測存活,就像人的心跳一樣,顧名思義,稱為心跳包。一般是用於長連線,對訊息實時性要求比較高的服務中,比如im服務,推送服務。

在即時通訊領域和推送服務中,對訊息的實時性和可用性要求非常高,建立長連線,可以有效節省dns解釋時間,tcp/ip三次握手時間,同時為了保證連線是可用的,不至於經常發了訊息對方無法收到,必須要有一種機制檢測連線的有效性。tcp是乙個基於連線的協議,連線是由乙個狀態機進行維護,當連線建立成功後,雙方都處於established ,除非我們進行主動呼叫,否則狀態一直不會變化,即使中間路由已經崩潰,網線已經被剪斷。tcp有一種keepalive機制,tcp層在定時時間傳送相應的keepalive探針以確保連線的可用性,預設每7200秒傳送一次,超過75秒沒有返回就超時,超時後重試10次,雖然可以修改預設值,但仍然無法滿足要求。尤其是考慮到一種特殊情況,tcp連線存活,但是主機不處於存活狀態,比如cpu負載到100%,無法響應任何請求。這時候,就需要客戶端主動切斷連線,主動切換到其他備用機。

合理間隔

心跳太短保證不了可靠性,太頻繁會帶來高耗電和大量的流量消耗,這在移動裝置上面是不可接受的。最合理的解決方案是設定乙個合理的間隔,一般可以根據程式狀態進行調整,逐步拉長心跳間隔,5分鐘,10分鐘,甚至15分鐘。服務端進行可靠性判斷的時候也可以放寬標準,只有n次超時才被認為是連線已經斷開。心跳的週期以最後一條指令為準,而非固定間隔。

自定義應用層實現協議

在demo中,雙方約定乙個協議,傳送方先對管道寫入乙個8位的byte值,接收方只要一接收到資料,馬上按照byte型別標準讀取前8位,通過這乙個位元組的值來確定對方現在發過來的是什麼型別的資料。為什麼要選擇byte呢?因為byte足夠短,只占用乙個位元組,儘量減少資料傳輸量,可以通過乙個位元組表達256種情況。當然根據實際業務需求,選擇int,long型別也是完全沒問題的。

在這個例子中,我們約定byte的值是1的話,那麼我們解釋為心跳包,後面不再有資料,直接在螢幕中列印收到客戶端的心跳包,byte的值是2的話,我們知道對方要發乙個字串過來,那麼需要進一步處理,再次呼叫readutf方法,讀取乙個utf-8字串

服務端建立乙個類,採用同步多執行緒模式,主類負責接收socket請求,子執行緒worker類負責處理業務邏輯

public class server 

}catch (exception e)}}

worker執行緒

class worker implements runnablecatch (exception e)

}public void run()else if(type == 2)

}}catch (eofexception e) catch (ioexception ioe) finally catch (exception e)}}

}}

public class client 

oos.close();

bufferedreader.close();

}catch (ioexception e)finally catch (ioexception e2)}}

}

心跳專門開一條執行緒來傳送,這樣不受主線程業務的堵塞**影響

class sendheartbeat implements runnable

public void run()

}}catch (exception e)}}

class timestore

//同樣,多執行緒下寫入需要加鎖

public synchronized void setlastsendtime(long lastsendtime)

}

心跳包實現

class program catch exception ex string msg 其實我在潛水,請不要拋棄我 發往伺服器 networkstream streamtoserver cline.getstream byte bstring encoding.unicode.getbytes ms...

心跳包技術

心跳機制是定時傳送乙個自定義的結構體 心跳包 讓對方知道自己還活著,以確保連線的有效性的機制 從字面意思上來看,我們可以知道,它其實在檢測socket是否斷開的環境下有很大作用,我們就不用擔心socket會因為不正常掉線而使得自己的資料丟失了,接下來我們就好好來看看它到底該如何去用 心跳檢測步驟 1...

獲取別人 我們如何獲取資訊

思維的第一步就是獲取資訊,那麼我們是如何獲取資訊的呢?主要有三種方法,分別是 獲取外界資訊 即我們每天看到的,聽到的資訊。大腦提取 即你的記憶,比如你回到母校,想起曾經在這裡學習的時光 又比如你 看到床前明月光 馬上就想起 疑是地上霜 大腦迸發出的靈感。比如你思考良久的問題,在你走路的時候,突然就想...