導航:首頁 > 編程語言 > java心跳長連接

java心跳長連接

發布時間:2025-06-30 09:46:24

1. Swoole學習筆記五:搭建WebSocket長連接 之 客戶端實現心跳重連

前言

設想一個場景,進入index.php頁面後正常上線,與服務端握手成功。突然,網線被挖斷,3分鍾後恢復網路,頁面未刷新,未接收服務端斷開提示。是否需要刷新頁面重新登錄?答案是否定的,用戶期望無需刷新即可保持連接。面對此情況,我們需要在程序中實現心跳重連,以確保連接的穩定性和用戶體驗。

什麼是心跳重連

心跳與重連是兩個概念。心跳操作定時執行,確保連接狀態的監測;重連操作則在連接斷開後自動嘗試恢復連接。在WebSocket中,網路可能出現臨時中斷,瀏覽器不會觸發onclose事件,導致我們無法得知連接狀態。通過心跳檢測,我們能及時發現斷開情況,並執行預設的重連操作。這樣,心跳重連機制應運而生。

客戶端心跳重連實現

修改index.php代碼,參考案例四的demo。開啟兩個瀏覽器標簽分別訪問index.php,斷開網路1分鍾後觀察頁面提示,再恢復網路連接。

完整案例DEMO可直接在開源欄目下載:Swoole聊天室Demo之二

上一篇文章已發布至專欄,有興趣的朋友可查閱。

推薦使用基於Swoole4.5+研發的PHP框架。該框架採用註解實現多種功能,適合快速上手Swoole擴展,提供高效開發體驗。

2. 如何實現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來實現心跳功能,使其真正實現長連接。

閱讀全文

與java心跳長連接相關的資料

熱點內容
php開源論壇有哪些 瀏覽:581
哈夫曼解壓演算法 瀏覽:973
天諭怎麼找伺服器 瀏覽:618
人數最多社區最好的編程語言 瀏覽:695
app一般在哪裡評論 瀏覽:287
照片縮小app哪個好用 瀏覽:420
怎麼搭建伺服器內網 瀏覽:527
加密解密知識學習視頻 瀏覽:747
手機歌曲壓縮 瀏覽:679
伺服器文件怎麼發 瀏覽:850
android匿名內部類 瀏覽:355
量子加密數據傳輸系統 瀏覽:816
加密應用鍵盤 瀏覽:404
dvb加密是動態的嗎 瀏覽:215
如何設置路由器首選伺服器地址 瀏覽:217
傳奇攻城命令 瀏覽:912
2018最受程序員歡迎 瀏覽:629
如何下載廣西視聽app 瀏覽:728
宜昌有編程考級么 瀏覽:605
php判斷數組數量 瀏覽:892