手機能夠使用聯網功能是因為手機底層實現了tcp/ip協議,可以使手機終端通過無線網路建立tcp連線。tcp協議可以對上層網路提供介面,使上層網路資料的傳輸建立在「無差別」的網路之上。
建立起乙個tcp連線需要經過「三次握手」:
第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入syn_send狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀態;
第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=k+1),此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手。
握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,tcp連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,tcp 連線都將被一直保持下去。斷開連線時伺服器和客戶端均可以主動發起斷開tcp連線的請求,斷開過程需要經過「四次握手」(過程就不細寫了,就是伺服器和客戶端互動,最終確定斷開)
剛才說到長連線建立連線後,理想狀態下是不會斷開的,但是由於網路問題,可能導致一方斷開後,另一方仍然在傳送資料,或者有些客戶端長時間不傳送訊息,伺服器還維持這他的客戶端不必要的引用,增加了伺服器的負荷。因此我們引入了心跳機制。
心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的乙個空包。
總的來說,心跳包主要也就是用於長連線的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。
心跳包的傳送,通常有兩種技術
由應用程式自己傳送心跳包來檢測連線是否正常,大致的方法是:伺服器在乙個 timer事件中定時 向客戶端傳送乙個短小精悍的資料報,然後啟動乙個低階別的執行緒,在該執行緒中不斷檢測客戶端的回應, 如果在一定時間內沒有收到客戶端的回應,即認為客戶端已經掉線;同樣,如果客戶端在一定時間內沒 有收到伺服器的心跳包,則認為連線不可用。
1客戶端每隔乙個時間間隔發生乙個探測包給伺服器
2客戶端發包時啟動乙個超時定時器
3伺服器端接收到檢測包,應該回應乙個包
4如果客戶機收到伺服器的應答包,則說明伺服器正常,刪除超時定時器
5如果客戶端的超時定時器超時,依然沒有收到應答包,則說明伺服器掛了
[csharp]view plain
copy
using system;
using system.collections.generic;
using system.threading;
///
/// 客戶端上線提示
///
///
private
static
void clientonline(clientinfo clientinfo)
static
void main()
system.threading.thread.sleep(1000);
while (true)
} else
} } }
} ///
/// 服務端
///
public
class server
///
/// 開啟服務端
///
public
void start()
///
/// 掃瞄離線
///
private
void scanoffline()
// 判斷最後心跳時間是否大於3秒
timespan sp = system.datetime.now - clientinfo.lastheartbeattime;
if (sp.seconds >= 3)
// 修改狀態
clientinfo.state = false;
} }
} }
} ///
/// 接收心跳包
///
/// 客戶端id
public
void receiveheartbeat(int32 clientid)
else
} } }
} ///
/// 客戶端
///
public
class client
///
/// 開啟客戶端
///
public
void start()
///
/// 向伺服器傳送心跳包
///
private
void heartbeat()
} } ///
/// 客戶端資訊
///
public
class clientinfo
}
C 之實現Scoket心跳機制
手機能夠使用聯網功能是因為手機底層實現了tcp ip協議,可以使手機終端通過無線網路建立tcp連線。tcp協議可以對上層網路提供介面,使上層網路資料的傳輸建立在 無差別 的網路之上。建立起乙個tcp連線需要經過 三次握手 第一次握手 客戶端傳送syn包 syn j 到伺服器,並進入syn send狀...
tcp心跳機制
對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...
Eureka 心跳機制
server服務端 server port 8761 eureka client 例項是否在eureka伺服器上註冊自己的資訊以提供其他服務發現,預設為true register with eureka false 此客戶端是否獲取eureka伺服器登錄檔上的註冊資訊,預設為true fetch r...