C 之實現Scoket心跳機制

2021-08-04 15:25:36 字數 2605 閱讀 6679

手機能夠使用聯網功能是因為手機底層實現了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...