出於最近對im研究的興趣,看到smack裡有個30s傳送乙個空訊息的執行緒,了解了下關於心跳包,keepalive的知識。 tcp的socket本身就是長連線的,那麼為什麼還要心跳包呢?
搜尋到的資料解釋如下:
一:內網機器如果不主動向外發起連線,外網機沒法直連內網的,這也是內網機安全的原因之一吧,又因為路由器會把這個關係記錄下來,但是過一段時間這個記錄可能會丟失 ,所有每乙個客戶端每隔一定時間就會向伺服器傳送訊息,以保證伺服器可以隨時找到你,這東西被稱為心跳包。
二:理論上說,這個連線是一直保持連線的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有資料互動的連線給斷掉。在這個時候,就需要我們的心跳包了,用於維持長連線,保活。在獲知了斷線之後,伺服器邏輯可能需要做一些事情,比如斷線後的資料清理呀,重新連線呀……當然,這個自然是要由邏輯層根據需求去做了。總的來說,心跳包主要也就是用於長連線的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。
三:
如果不主動關閉socket的話,系統不會自動關閉的,除非當前程序掛掉了,作業系統把占用的socket**了才會關閉。為什麼需要心跳連線主要是判斷當前連線是否是有效的、可被使用的。在實際應用中假設一段時間沒有資料傳輸時候理論上說應該連線是沒有問題的,但是網路複雜,中途出現問題也是常見的,網線被掐斷了、對方程序掛掉了、頻繁丟包等,這時候tcp連線是不可使用的,但是對於應用層並不知道,如果需知道網路情況則要很複雜的超時進行了解,tcp從底層就實現了這樣的功能。心跳機制是tcp在一段時間間隔後傳送確定連線端是否還存在,如果存在的話就會回傳乙個包確定網路有效,如果心跳包有問題,則通知上層應用當前網路有問題了。
這取決於你的server端的超時配置, 每個socket連線都是長連線,它是乙個相當占用系統資源的通訊管道, 如果這個長連線什麼事也沒乾硬是要佔著資源,則server端可以選擇關閉這個連線,以省下資源讓更多的使用者連線進來。
所以,即便客戶端的是採用死迴圈while(true)方式連到服務端,對於特定的客戶端和服務端型別來說也需要一定時間間隔的心跳(告訴服務端,我還活著,雖然我沒幹活也沒說話,但別把我關了)。
記得以前開發手機遊戲時,索愛有一款手機有強制要求,客戶端如果超過三分鐘無訊息發向網路服務端,則會在客戶端自動地強制把socket關斷。因為socket長連線相對於手機這樣資源少的裝置來說是寶貴的資源。 (這個強制是指客戶端系統自動關的,不是我們**close的)
2.3.
長連線(輪詢,心跳,socket)
概念 表示客戶端和伺服器端保持聯絡,客戶端向伺服器端一直獲取資料,或者是伺服器端一直向客戶端推送資料。基本的長連線方式 輪詢表示客服端利用定時器原理 setinterval 間隔時間內向伺服器請求最新資料。心跳原理跟輪詢類似,但是心跳在一段時間內沒有向到伺服器請求,就會認為客戶端狀態異常。socke...
長連線為何要傳送心跳包
回來之後我查詢資料後發現,android的推送在後台維持的服務都會傳送心跳包來維持長連線,當一台智慧型手機連上流動網路的時候,其實並沒有鏈結上internet,運營商分配給手機的ip其實只是乙個內網的ip,手機端要連上internet必須要通過運營商的閘道器進行ip轉換,這個閘道器稱為nat net...
關於Socket通訊服務的心跳包
在一些系統中,經常用到客戶端和伺服器之間的通訊,伺服器要時刻知道客戶端的網路連線狀態,這大概就是所謂的 心跳包 下面是客戶端心跳包核心 region 客戶端的感覺系統 啟動記時器 public void beginthetimer 啟動監視 已登入使用者通訊情況 的執行緒 public void t...