Android長(zhǎng)連接,怎么處理心跳機(jī)制

以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個(gè)人學(xué)習(xí)
原文http://huachao1001.github.io/article.html?6sO6QBBT


1. 心跳機(jī)制

心跳機(jī)制是定時(shí)發(fā)送一個(gè)自定義的結(jié)構(gòu)體(心跳包),讓對(duì)方知道自己還活著,以確保連接的有效性的機(jī)制。

當(dāng)一臺(tái)智能手機(jī)連上移動(dòng)網(wǎng)絡(luò)時(shí),其實(shí)并沒(méi)有真正連接上Internet,運(yùn)營(yíng)商分配給手機(jī)的IP其實(shí)是運(yùn)營(yíng)商的內(nèi)網(wǎng)IP,手機(jī)終端要連接上Internet還必須通過(guò)運(yùn)營(yíng)商的網(wǎng)關(guān)進(jìn)行IP地址的轉(zhuǎn)換,這個(gè)網(wǎng)關(guān)簡(jiǎn)稱為NAT(NetWork Address Translation),簡(jiǎn)單來(lái)說(shuō)就是手機(jī)終端連接Internet 其實(shí)就是移動(dòng)內(nèi)網(wǎng)IP,端口,外網(wǎng)IP之間相互映射。 由于大部分的移動(dòng)無(wú)線網(wǎng)絡(luò)運(yùn)營(yíng)商為了減少網(wǎng)關(guān)NAT映射表的負(fù)荷,如果一個(gè)鏈路有一段時(shí)間沒(méi)有通信時(shí)就會(huì)刪除其對(duì)應(yīng)表,造成鏈路中斷,正是這種刻意縮短空閑連接的釋放超時(shí),原本是想節(jié)省信道資源的作用,卻讓?xiě)?yīng)用不得以遠(yuǎn)高于正常頻率發(fā)送心跳來(lái)維護(hù)推送的長(zhǎng)連接。

另外,長(zhǎng)連接比較耗電。

2. android系統(tǒng)的推送和iOS的推送有什么區(qū)別

首先我們必須知道,所有的推送功能必須有一個(gè)客戶端和服務(wù)器的長(zhǎng)連接,因?yàn)橥扑褪怯煞?wù)器主動(dòng)向客戶端發(fā)送消息,如果客戶端和服務(wù)器之間不存在一個(gè)長(zhǎng)連接那么服務(wù)器是無(wú)法來(lái)主動(dòng)連接客戶端的。因而推送功能都是基于長(zhǎng)連接的基礎(chǔ)是上的。

IOS長(zhǎng)連接是由系統(tǒng)來(lái)維護(hù)的,也就是說(shuō)蘋(píng)果的IOS系統(tǒng)在系統(tǒng)級(jí)別維護(hù)了一個(gè)客戶端和蘋(píng)果服務(wù)器的長(zhǎng)鏈接,IOS上的所有應(yīng)用上的推送都是先將消息推送到蘋(píng)果的服務(wù)器然后將蘋(píng)果服務(wù)器通過(guò)這個(gè)系統(tǒng)級(jí)別的長(zhǎng)連接推送到手機(jī)終端上,這樣的的幾個(gè)好處為:

  • 在手機(jī)終端始終只要維護(hù)一個(gè)長(zhǎng)連接即可,而且由于這個(gè)長(zhǎng)連接是系統(tǒng)級(jí)別的不會(huì)出現(xiàn)被殺死而無(wú)法推送的情況。
  • 省電,不會(huì)出現(xiàn)每個(gè)應(yīng)用都各自維護(hù)一個(gè)自己的長(zhǎng)連接。
  • 安全,只有在蘋(píng)果注冊(cè)的開(kāi)發(fā)者才能夠進(jìn)行推送,等等。

android的長(zhǎng)連接是由每個(gè)應(yīng)用各自維護(hù)的,但是google也推出了和蘋(píng)果技術(shù)架構(gòu)相似的推送框架,C2DM,云端推送功能,但是由于google的服務(wù)器不在中國(guó)境內(nèi),其他的原因你懂的。所以導(dǎo)致這個(gè)推送無(wú)法使用,android的開(kāi)發(fā)者不得不自己去維護(hù)一個(gè)長(zhǎng)鏈接,于是每個(gè)應(yīng)用如果都24小時(shí)在線,那么都得各自維護(hù)一個(gè)長(zhǎng)連接,這種電量和流量的消耗是可想而知的。雖然國(guó)內(nèi)也出現(xiàn)了各種推送平臺(tái),但是都無(wú)法達(dá)到只維護(hù)一個(gè)長(zhǎng)連接這種消耗的級(jí)別。

3. 推送的實(shí)現(xiàn)方式

  • 客戶端不斷的查詢服務(wù)器,檢索新內(nèi)容,也就是所謂的pull 或者輪詢方式
  • 客戶端和服務(wù)器之間維持一個(gè)TCP/IP長(zhǎng)連接,服務(wù)器向客戶端push
  • 服務(wù)器有新內(nèi)容時(shí),發(fā)送一條類似短信的信令給客戶端,客戶端收到后從服務(wù)器中下載新內(nèi)容,也就是SMS的推送方式

蘋(píng)果的推送系統(tǒng)和googleC2DM推送系統(tǒng)其實(shí)都是在系統(tǒng)級(jí)別維護(hù)一個(gè)TCP/IP長(zhǎng)連接,都是基于第二種的方式進(jìn)行推送的。第三種方式由于運(yùn)營(yíng)商沒(méi)有免費(fèi)開(kāi)放這種信令導(dǎo)致了這種推送在成本上是無(wú)法接受的,雖然這種推送的方式非常的穩(wěn)定,高效和及時(shí)。

在TCP機(jī)制里面,本身是存在有心跳包機(jī)制的,也就是TCP選項(xiàng):SO_KEEPALIVE. 系統(tǒng)默認(rèn)是設(shè)置的2小時(shí)的心跳頻率。

心跳包的機(jī)制,其實(shí)就是傳統(tǒng)的長(zhǎng)連接。或許有的人知道消息推送的機(jī)制,消息推送也是一種長(zhǎng)連接 ,是將數(shù)據(jù)有服務(wù)器端推送到客戶端這邊從而改變傳統(tǒng)的“拉”的請(qǐng)求方式。下面介紹一下安卓和客戶端兩個(gè)數(shù)據(jù)請(qǐng)求的方式

  • push 這個(gè)也就是有服務(wù)器推送到客戶端這邊 現(xiàn)在有第三方技術(shù) 比如極光推送。
  • pull 這種方式就是客戶端向服務(wù)器發(fā)送請(qǐng)求數(shù)據(jù)(http請(qǐng)求)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 互聯(lián)網(wǎng)推送服務(wù)原理:長(zhǎng)連接+心跳機(jī)制(MQTT協(xié)議)Android推送技術(shù)研究Android實(shí)現(xiàn)推送方式解決方案a...
    合肥黑閱讀 3,257評(píng)論 0 12
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,300評(píng)論 6 13
  • 迎著清晨的第一縷陽(yáng)光,開(kāi)始每天的晨讀,換好運(yùn)動(dòng)鞋出門(mén)散步,利用閒散的碎片時(shí)間聽(tīng)兩本樊登讀書(shū),頓時(shí)覺(jué)得一天的開(kāi)始變得...
    Ashley_Z閱讀 146評(píng)論 0 0
  • 家里很溫暖 米飯我可以吃下兩碗 紅茶又多喝了幾盞 吃多了就去墻邊站站 累了就朝窗外喊喊 下午不能只是慵懶 來(lái)福自己...
    霖霖想要小馬甲閱讀 217評(píng)論 0 0

友情鏈接更多精彩內(nèi)容