使用消息推送的方法有不少,原理大體是:移動端與消息服務器保持一個長鏈接,一旦服務器有消息就推給客戶端,客戶端收到消息作相應的處理。javascript
B/S架構的系統多使用HTTP協議,因此首先來看看HTTP協議:html
HTTP協議的特色:
列表內容
無狀態性;
經過Internet發送請求消息和響應消息;
使用端口接收和發送消息,默認爲80端口;可是底層仍是使用Socket完成。
HTTP協議決定了服務器與客戶端之間的鏈接方式,沒法直接實現消息推送。
因此就有一些變相的解決方法: 雙向通訊和消息推送。html5
客戶端定時向服務器發送Ajax請求,服務器接到請求後立刻返回響應信息,並關閉鏈接。
優勢:後端程序編寫比較容易
缺點:請求中大半是無用的,浪費帶寬和服務器資源
實例:適用於小型應用java
客戶端向服務器發送Ajax請求,服務器接到請求後Hold住鏈接,直到有新消息才返回響應信息,並關閉鏈接;客戶端處理完響應信息後再向服務器發送新的請求。
優勢:在無消息的狀況下不會頻繁的請求,耗費的資源少
缺點:服務器Hold住鏈接會消耗資源,返回數據順序沒法保證,難於管理和維護
實例:WebQQ、Hi網頁版、FaceBook IM等web
在頁面中嵌入一個隱藏的jframe,將這個隱藏的iframe的src屬性設置爲對一個長鏈接的請求或者採用XRH請求,服務器端就能源源不斷地往客戶端輸入數據。
優勢:消息即時到達,不發無用的請求;管理起來也相對方便
缺點:服務器維護一個長鏈接會增長開銷
實例:Gmail聊天ajax
在頁面中嵌入一個使用了Socket類的Flash程序,JavaScript經過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通訊,JavaScript在收到服務器端傳送的信息後控制頁面的顯示。
優勢:實現真正的即時通訊,而不是僞即時
缺點:客戶端必須安裝Flash插件;非HTTP協議,沒法自動穿越防火牆
實例:網絡互動遊戲後端
WebSocket是HTML5開始提供的一種瀏覽器與服務器間進行全雙工通信的網絡技術;依靠這種技術能夠實現客戶端和服務器端的長鏈接,雙向實時通信。
優勢:事件驅動;異步;使用WS或者WSS協議的客戶端Socket;可以實現真正意義上的推送功能
缺點:少部分瀏覽器不支持,不一樣瀏覽器支持的程度和方式都不一樣瀏覽器
參考:服務器
https://blog.csdn.net/wangchengiii/article/details/77895280websocket
https://88250.b3log.org/web-message-push
Android 幾種消息推送方案總結:https://www.cnblogs.com/Joanna-Yan/p/6241354.html