我們知道網路的3要素:主機位址(也就是常說的ip位址)、埠號(做過伺服器開發的童鞋都知道,80、8080...)、傳輸協議。通過ip位址可以找到對應的主機,通過埠號可以找到主機上對應的程式,通過傳輸協議可以確定網路間是如何傳入資料的。
我們常見的網路傳輸協議比如:http、https、tcp、udp等。socket 也是一種傳輸協議,它的底層是基於tcp/ip協議。通過socket協議使網路上的兩個程式通過乙個雙向的通訊連線起來實現資料交換。顧名思義,通過socekt建立的連線,至少要有2個端,乙個執行於伺服器端的socket,乙個執行於客戶端的socket。
伺服器端的socket,我們可以理解成乙個特殊的應用程式,一直處於開啟狀態。它有乙個固定埠,監聽客戶端socket的連線,一旦接受到客戶端的連線請求,就會做出相應的響應。伺服器端和客戶端建立起連線之後,就可以互相傳輸資料了。
通俗理解: 可以把伺服器端理解成乙個巨大的水庫,客戶端理解成乙個個小的水桶,要想讓水庫和水桶之間可以互相傳遞水流,就必須socket這個東西,讓水庫和水桶建立起乙個雙向連線。如下圖:
此時,客戶端socket和伺服器端socket建立起了連線,就可以互相傳遞資料了
既然,客戶端和伺服器端建立起了長連線,那麼怎麼知道長連線一直處於保持狀態,而沒有斷開那?我們不能空口說它們之間保持了長連線,就一直保持著吧!兩端是通過一種「心跳包」的機制來檢測長連線是否處於保持狀態。
注: 「心跳包」就是伺服器端和客戶端約定好的一種資料。
所謂「心跳包」機制,其實就是伺服器端按照固定的頻率給客戶端傳送心跳包,客戶端接受到心跳包之後做回應。如果伺服器端傳送了乙個心跳包,客戶端沒有回應。伺服器認為客服端已經不在了,就會斷開長連線。
說明: 伺服器只是在客戶端長時間沒有給伺服器傳送資料的情況下,才會發心跳包。
比如我們制定固定頻率為30秒,即:伺服器每隔30秒給客戶端傳送乙個心跳包。
假如伺服器和客戶端互相歡快的傳遞資料已經超過30秒,但是此時在30秒的時候並不會傳送心跳包。
為什麼不會傳送心跳包??
因為傳送心跳包的時間,是從客戶端最後一次傳遞資料給伺服器的時間開始計算的,比如,客戶端最後一次給伺服器傳遞資料是 10點05分05秒,從此刻開始計算,如果到05分35秒的時候,客戶端沒有給伺服器端傳遞資料,那麼伺服器就會傳送心跳包給客戶端,客戶端接受到心跳包做回應,告訴伺服器長連線處於保持中,但是如果在05分34秒的時候,客戶端給伺服器端傳遞了資料,那麼此時就會從05分34秒從新開始計算,再間隔30秒....
tcp心跳機制
對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...
Eureka 心跳機制
server服務端 server port 8761 eureka client 例項是否在eureka伺服器上註冊自己的資訊以提供其他服務發現,預設為true register with eureka false 此客戶端是否獲取eureka伺服器登錄檔上的註冊資訊,預設為true fetch r...
tcp心跳機制
對連線上來的連線,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而伺服器不知道,得到乙個半連線這種情況。當然可以在協議裡加乙個心跳包,然後伺服器端定時檢測,過一段時間就去輪訓一次,看哪些連線超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫程式碼來完成。還要鎖定連線列表,代價挺大的。記得以...