<var id="11116"><rt id="11116"></rt></var><var id="11116"></var>
  • <var id="11116"><rt id="11116"><big id="11116"></big></rt></var>

  • <acronym id="11116"><form id="11116"></form></acronym>
  • <var id="11116"></var>
    <code id="11116"><rt id="11116"></rt></code>
    <label id="11116"></label>
    <acronym id="11116"><form id="11116"></form></acronym>
    新聞動態 / IM客戶端消息推送的幾種方式及特點
    IM客戶端消息推送的幾種方式及特點
    消息推送推送

    提起消息推送一般人們會經常提起的有以下幾種:

    1.輪詢

    顧名思義,客戶端定期去向服務端詢問是否有新的消息,簡單點說就是服務端不關心客戶端的地址是什么,客戶端來詢問,直接告訴它就行。這種方案最簡單,但是卻不適用于即時通訊產品,因為即時通訊軟件的消息傳遞機制與一般的消息推送的區別就在即時這點,如果采用輪詢的方式,客戶端每幾秒就連一次服務器,對于手機電量與流量的消耗是很大的。

    2.XMPP

    XMPP是一種基于標準通用標記語言的子集XML的協議,它繼承了在XML環境中靈活的發展性。因此,基于XMPP的應用具有超強的可擴展性。經過擴展以后的XMPP可以通過發送擴展的信息來處理用戶的需求,以及在XMPP的頂端建立如內容發布系統和基于地址的服務等應用程序。而且,XMPP包含了針對服務器端的軟件協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程序或給一個配好系統添加功能。它的系統結構如下圖所示:

    但是它也有兩個致命的缺點:隨著通常超過70%的XMPP協議的服務器的數據流量的存在和近60%的被重復轉發,XMPP協議目前擁有一個大型架空中存在的數據提供給多個收件人。新的議定書正在研究,以減輕這一問題。它的另一個缺點是由于XMPP協議的方式被編碼為一個單一的長的XML文件,因此無法提供修改二進制數據。

    3.MQTT

    MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議。它的PUSH結構示意圖如下圖所示:

    MQTT由于開放源代碼,耗電量小等特點,在物聯網領域,傳感器與服務器的通信,信息的收集,MQTT都是不錯的方案。在手機移動端的消息推送也是備選的方案之一。但是它的設計初衷是為:大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的。而且他的實現比較復雜,服務端組件rsmb不開源,所以MQTT更適合于物聯網端的通信。

    4.長連接

    所謂長連接指建立SOCKET連接后不管是否使用都保持連接。當然有人會問長連接定時發送心跳,這和輪詢有什么區別?手機休眠狀態下連接會不會斷掉等。

    在這之前先來了解一下一些相關的概念。心跳包的作用:有人可能會覺得心跳包是用來通知服務端,客戶端當前的狀態。這種說法固然沒錯,但是本質是心跳包的主要作用是防止NAT超時,其次是檢查連接是否斷開。NAT是為了解決IP數量不足的問題而做的一種網絡地址的轉換。簡單講就是運營商的網關需要維護一個外網IP與內網IP及端口之間的一種映射關系。當前的移動網絡運營商在一定時間段內數據鏈路沒有數據通訊時,會更新NAT表中的映射關系,造成鏈路中斷。具體的NAT穿越等細節不在此討論。

    所以,可以粗略的認為心跳包的一個作用就是為了解決NAT中斷的問題。但是心跳包發送的間隔時間必須要小于NAT超時的時間,這樣才能保證鏈路的不中斷。

    下面簡單闡述一下心跳包與輪詢的區別,以此來說明長連接方案比輪詢方案的優勢。輪詢與心跳本質的不同是輪詢的目的是為了從服務端得到數據,而心跳是為了保持連接。而且輪詢比心跳更耗電,輪詢要經過TCP的三次握手,但是單次心跳缺不需要這樣。

    最后一個問題,手機休眠狀態下連接是否會斷掉。這個問題如果詳細討論的話比較復雜,涉及手機AP,BP處理器的處理策略,簡單點說就是TCP數據包能夠喚醒手機。因此長連接是比較適合手機移動端的即時通訊的。

    SDK打包中 — 0%
    SDK下載
    正在根據您選擇的SDK打包中,完成后自動下載
    0%

    日韩