心跳包機制及Socket通訊服務的心跳包

2021-06-05 13:45:51 字數 1463 閱讀 4522

心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。

在tcp的機制裡面,本身是存在有心跳包的機制的,也就是tcp的選項:so_keepalive。系統預設是設定的2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火牆這些斷線。而且邏輯層處理斷線可能也不是那麼好處理。一般,如果只是用於保活還是可以的。

心跳包一般來說都是在邏輯層傳送空的echo包來實現的。下乙個定時器,在一定時間間隔下傳送乙個空包給客戶端,然後客戶端反饋乙個同樣的空包回來,伺服器如果在一定時間內收不到客戶端傳送過來的反饋包,那就只有認定說掉線了。

其實,要判定掉線,只需要send或者recv一下,如果結果為零,則為掉線。但是,在長連線下,有可能很長一段時間都沒有資料往來。理論上說,這個連線是一直保持連線的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有資料互動的連線給斷掉。在這個時候,就需要我們的心跳包了,用於維持長連線,保活。

在獲知了斷線之後,伺服器邏輯可能需要做一些事情,比如斷線後的資料清理呀,重新連線呀……當然,這個自然是要由邏輯層根據需求去做了。

總的來說,心跳包主要也就是用於長連線的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。

在一些系統中,經常用到客戶端和伺服器之間的通訊,伺服器要時刻知道客戶端的網路連線狀態,這大概就是所謂的「心跳包」。

下面是客戶端心跳包核心**:

# region ++++++++++++++++++++ 客戶端的感覺系統

//啟動記時器

public void beginthetimer()

//啟動監視"已登入使用者通訊情況"的執行緒

public void testthenet(object myobject)  

/// 

/// 每隔1秒就是要來做這些事情的

/// 

public void delegatesendmypulse()

}# endregion +++++++++++++++++++++ 客戶端的感覺系統

下面是伺服器端核心**如下:

# region +++++++++++++++++++++++ 伺服器的感覺系統

//啟動記時器

public void loadthetimer()

//啟動監視"已登入使用者通訊情況"的執行緒

public void watchtheloginuser(object o)

//真正做事的工人:這個工人的使命是每隔1秒鐘後就檢視一下登記薄

//registry裡面有誰沒有定時來向伺服器報到了,如果出現誰三次檢查都沒有簽到則除之名

public void iamawatcher()}}

}# endregion +++++++++++++++++++ 伺服器的感覺系統

Socket心跳包機制

心跳包的傳送,通常有兩種技術 方法1 應用層自己實現的心跳包 由應用程式自己傳送心跳包來檢測連線是否正常,大致的方法是 伺服器在乙個 timer事件中定時 向客戶端傳送乙個短小精悍的資料報,然後啟動乙個低階別的執行緒,在該執行緒中不斷檢測客戶端的回應,如果在一定時間內沒有收到客戶端的回應,即認為客戶...

socket 心跳包機制

心跳包的傳送,通常有兩種技術 方法1 應用層自己實現的心跳包 由應用程式自己傳送心跳包來檢測連線是否正常,大致的方法是 伺服器在乙個 timer事件中定時 向客戶端傳送乙個短小精悍的資料報,然後啟動乙個低階別的執行緒,在該執行緒中不斷檢測客戶端的回應,如果在一定時間內沒有收到客戶端的回應,即認為客戶...

Socket心跳包機制

心跳包的傳送,通常有兩種技術 方法1 應用層自己實現的心跳包 由應用程式自己傳送心跳包來檢測連線是否正常,大致的方法是 伺服器在乙個 timer事件中定時 向客戶端傳送乙個短小精悍的資料報,然後啟動乙個低階別的執行緒,在該執行緒中不斷檢測客戶端的回應,如果在一定時間內沒有收到客戶端的回應,即認為客戶...