『壹』 Netty實現長連接的原理
主要邏輯 :
使用netty實現長連接,主要靠心跳來維持伺服器端及客戶端連接。
主要的實現邏輯如下:
伺服器端 :(HeartBeatRespHandler)
1, 伺服器在網路空閑操作一定時間後,服務端失敗心跳計數器加1。
2, 如果收到客戶端的ping心跳包,則清零失敗心跳計數器,如果連續n次未收到客戶端的ping心跳包,則關閉鏈路,釋放資源,等待客戶端重連。
客戶端 :(HeartBeatReqHandler)
1, 客戶端網路空閑在一定時間內沒有進行寫操作時,則發送一個ping心跳包。
2, 如果伺服器端未在發送下一個心跳包之前回復pong心跳應答包,則失敗心跳計數器加1。
3, 如果客戶端連續發送n(此處根據具體業務進行定義)次ping心跳包,伺服器端均未回復pong心跳應答包,則客戶端斷開連接,間隔一定時間進行重連操作,直至連接伺服器成功。
『貳』 如何實現android和伺服器的長連接
轉載 這種功能實際上就是數據同步,同時要考慮手機本身、電量、網路流量等等限制因素,所以通常在移動端上有一下兩個解決方案:
1.一種是定時去server查詢數據,通常是使用HTTP協議來訪問web伺服器,稱Polling(輪詢);
2.還有一種是移動端和伺服器建立長連接,使用XMPP長連接,稱Push(推送)。
從耗費的電量、流量和數據延遲性各方面來說,Push有明顯的優勢。但是使用Push的缺點是:
對於客戶端:實現和維護相對成本高,在移動無線網路下維護長連接,相對有一些技術上的開發難度。
對於伺服器:如何實現多核並發,cpu作業調度,數量龐大的長連接並發維護等技術,仍存在開發難點。
在講述Push方案的原理前,我們先了解一下移動無線網路的特點。
移動無線網路的特點:
因為 IP v4 的 IP 量有限,運營商分配給手機凳褲終端的 IP 是運營商內網的 IP,手機要連接 Internet,就需要通過運營商的網關做一個網路地址轉換(Network Address Translation,NAT)。簡單的說運營商的網關需要維護一個外網 IP、埠到內網 IP、埠的對應關系,以確保內網的手機可以跟 Internet 的伺服器通訊
GGSN(Gateway GPRS
Support Node 網關GPRS支持結點)模塊就實現了NAT功能。
因為大部分移動無線網路運營商都是為了減少網關的NAT映射表的負荷,所以如果發現鏈路中有一段時間沒有數據通訊時,會刪除其對應表,造成鏈路中斷。(關於NAT的作用及其原理可以查看我的另一篇博文:關於使用UDP(TCP)跨區域網,NAT穿透的心得)
Push在Android平台上長連接的實現:
既然我們知道我們移動端要和Internet進行通信,必須通過運營商的網關,所以,為了不讓NAT映射表失效,我們需要定時向Internet發送數據,因為只是為了不然NAT映射表失效,所以只需發送長度為0的數據即可。
這時候就要用到定時器,在android系統上,定時器通常有一下兩種:
1.java.util.Timer
2.android.app.AlarmManager
分析:
Timer:可以按照計劃或者時間周期來執行相關的任務。但是Timer需要用WakeLock來讓CPU保持喚醒狀態,才能保證任務的執行,這樣子會消耗大量流量;當CPU處於休眠的時候,就不能喚醒執行任務,所以應用於移動端明顯是不合適。
AlarmManager:AlarmManager類是屬於android系統封裝好來管理RTC模塊的管理類。悔粗銷這里就涉及到RTC模塊,要更好地了解兩者的區別,就要明白兩者真正的區別。
RTC(Real- Time Clock)實時鬧鍾在一個嵌入式系統中,通常採用RTC
來提供可靠的系統時間,包括時分秒和年月日等;而且要求在系統處於關碧游機狀態下它也能夠正常工作(通常採用後備電池供電),它的外圍也不需要太多的輔助電路,典型的就是只需要一個高精度的32.768KHz
晶體和電阻電容等。(如果對這方面感興趣,可以自己查閱相關資料,這里就說個大概)
好了,回來正題。所以,AlarmManager又稱全局定時鬧鍾。這意味著,當我用使用AlarmManager來定時執行任務,CPU可以正常地休眠,只有在執行任務是,才喚醒CPU,這個過程是很短時間的。
下面簡單來說明其使用:
1.類似於Timer功能:
//獲得鬧鍾管理器
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//設置任務執行計劃
am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000,
sender);//從firstTime才開始執行,每隔5秒再執行
2.實現全局定時功能:
//獲得鬧鍾管理器
AlarmManager
am = (AlarmManager)getSystemService(ALARM_SERVICE);
//設置任務執行計劃
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
5*1000, sender);//從firstTime才開始執行,每隔5秒再執行
總結:在android客戶端使用Push推送時,應該使用AlarmManager來實現心跳功能,使其真正實現長連接。
『叄』 心跳包實現思路
心跳包實現思路涉及客戶端與伺服器之間的在線檢測機制,確保連接有效性。客戶端與伺服器建立連接後,服務端通過維護在線用戶字典,以檢測客戶端狀態。客戶端定期向伺服器發送心跳包,服務端接收後更新字典中對應客戶端數據,以零值表示在線狀態。若在規定時間內未收到心跳包,服務端將字典值累加,當累計達到預設閾值(如3),則判定客戶端已斷線。
心跳機制在游戲開發中尤為重要,用於確認連接狀態,避免因網路波動或延遲導致的假斷線情況。心跳包通常為自定義結構體,定時發送以證明客戶端在線。
在TCP socket心跳機制中,心跳包可由客戶端或伺服器主動發送,但由客戶端發送的機制相對經濟,避免了伺服器頻繁處理心跳包帶來的開銷。客戶端與伺服器間的機制實現如下:
1)伺服器需記錄每個客戶端的IP地址與計數器(count),使用映射數據結構(如字典)進行管理。服務端主線程利用select函數實現多路IO復用,監聽新連接與接收數據包(心跳包),同時開啟子線程監控心跳狀態。
2)客戶端僅需啟動子線程,按照設定周期(例如3秒)向伺服器發送心跳包。
以下為Linux環境下socket心跳包的基本實現示例:
『肆』 安卓怎樣讓app一直運行不掉線
要讓安卓的app一直運行不掉線,可以採取以下措施:
1. 適當延長後台運行時間:在應用運行時,可以通過使用Android的AlarmManager來設置適當的延長後台運行時間,以防止應用被系統自動終止。
2. 採用前台服務:可以將應用設計為前台服務,在運行時將應用提升為系統的前台應用,這樣可以使應用一直運行,並避免被系統自動回收。
3. 進行心跳檢測:可以設置應用每隔一定時間進行心跳檢測,以保持應用和伺服器之間的連接。
4. 優化網路請求:在進行網路請求時,可以優化請求的處理方式和數據傳輸的方式,以減少網路負載,避免網路中斷或掉線。
總之,要讓安卓的app一直運行不掉線,需要根據具體情況採取相應的措施來保證應用的穩定運行。
『伍』 什麼是TCP/IP通訊中的心跳包
心跳包就是在客戶端和伺服器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
心跳包在GPRS通信和CDMA通信的應用方面使用非常廣泛。數據網關會定時清理沒有數據的路由,心跳包通常設定在30-40秒之間。
所謂的心跳包就是客戶端定時發送簡單的信息給伺服器端告訴它我還在而已。代碼就是每隔幾分鍾發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鍾內沒有收到客戶端信息則視客戶端斷開。
(5)APP和伺服器怎麼維持心跳擴展閱讀:
心跳包作用:
在TCP的機制裡面,本身是存在有心跳包的機制的,也就是TCP的選項。系統默認是設置的是2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火牆這些斷線。而且邏輯層處理斷線可能也不是那麼好處理。一般,如果只是用於保活還是可以的。
心跳包一般來說都是在邏輯層發送空的包來實現的。下一個定時器,在一定時間間隔下發送一個空包給客戶端,然後客戶端反饋一個同樣的空包回來,伺服器如果在一定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。只需要send或者recv一下,如果結果為零,則為掉線。
但是,在長連接下,有可能很長一段時間都沒有數據往來。理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有數據交互的連接給斷掉。