1. 程式人生 > >App中如何實現訊息推送

App中如何實現訊息推送

轉載地址:https://zhuanlan.zhihu.com/p/19801751

如今的手機每天都會被各種App的訊息推送覆蓋,訊息推送也成了週末去哪兒APP增加自己曝光量的一種重要手段。訊息推送的技術也日漸成熟,各種平臺紛紛出現,搶佔這一業務,本文就從技術角度來吐槽吐槽。本文是由我們的無線開發團隊原創和整理,如果轉載請務必先諮詢本團隊。


首先介紹下訊息推送,即Push的技術基礎:

什麼叫Push?


真正的Push應該是隻要一個Client裝置連線到網際網路中,什麼也不做等在那裡,Server端隨時都可以將資料(訊息是資料的一種)傳送到這個Client上,就好像Server等在那裡,Client隨時可以訪問Server一樣。

用Server端做個類比,當一個Web Server在網際網路上部署好以後,任何一臺電腦都可以通過網際網路去訪問Server:從Server獲取資料、向Server提交資料。向Server提交資料實際就是Client Push資料到Server。在這個模式中,Server所做的事情就是等待,等待任意的Client主動來訪問它,並且不需要和Client端保持連線。Server是如何做到這點的呢,實際上是通過listen的方式,具體來說是socket的listen,Server端不需要做額外的事情,只要告訴socket,你去listen吧,有Client請求過來就交給對應的程式去完成吧,就這麼簡單。

Client端的Push是否能做到這點呢,我們這裡只考慮Client的裝置是智慧機的情況,主要就是Android、iOS,還有winPhone?大概吧。Android和iOS都是基於linux系統的,有完整的網路協議架構,所以使用socket完全沒有問題,winPhone作為一個智慧機來說,我想也是沒有問題的。所以對於這些智慧機來說,讓一個socket去listen,等待網際網路上的任意一臺其他裝置來訪問是可行的,Server Push資料給Client只需要去連線Client的socket就可以了。

事情是這麼簡單嗎?顯然不是,不然就不會有各個大小公司跳出來做平臺了。

ps:首先我們要了解socket是什麼,socket是基於tcp/ip協議的一個實現,而tcp/ip是整個網際網路的協議基礎。關於tcp/ip,socket具體內容不在這裡贅述,不瞭解的可以去查相關資料。

Server端和Client端有一個很重要的區別,Server端是有固定的公網ip的,而Client端的ip不是固定的,甚至不一定具有公網ip。Client訪問Server時,實際是通過ip找到Server進行訪問的(域名?域名最終也是被解析成ip),有固定的公網ip才方便網際網路上的其他裝置來訪問。而反過來Server想找某個Client時,由於Client的ip不固定,Server端是無法找到Client的。所以即使Client這裡放了一個socket在listen,Server找不到Client,還是連線不上Client。

所以Client是無法使用Server的這種模式去被動接受Push的。是否有辦法讓Server端知道Client的ip呢,比如每次Client更換ip以後將ip發給Server?這種方法顯然是成本高且不可靠的。

所以,目前的Push技術實現基本都是Client主動連線Server,鑽牛角尖來講,現在的Push其實都是偽Push。下面簡單講兩種方式:

一、輪詢法:

這種方法最簡單,Client每過一段時間向Server請求一次資料。優缺點很明顯,優點是實現簡單;缺點是間隔時間不好控制,並且消耗大(電量、流量)。

二、長連線法:

還是從socket入手(又是這貨?),Client使用socket連線Server,並且保持socket連線,Server隨時可以通過這個socket傳送資料給Client。優點:最有效,客戶端裝置消耗比第一種小(裝置應該從系統層對socket的長連線做優化,socket連結維護成本從客戶端來講應該是小於頻繁的http請求的);缺點:服務端壓力大,每一個裝置都需要一個socket連線。

還有一些其他協議比如xmpp,其實也逃不過上面兩種方式,只是做了一些封裝。或者還有一種非網際網路方式的做法,比如監聽簡訊法,要push的時候,先發一條手機到目的手機,Client監聽到了標的簡訊,然後向Server請求資料,不過像這類劍走偏鋒的方法,限制條件也很多,不是很實用。

總結一下,目前各個推送平臺的實現都是基於長連線法的,如果App要自己實現推送,也是建議使用這種方式。但是如果每個App都用一個長連線,那麼手機也吃不消了,所以又有一些其他技術來實現,我們下篇再講。

相關推薦

App如何實現訊息

轉載地址:https://zhuanlan.zhihu.com/p/19801751 如今的手機每天都會被各種App的訊息推送覆蓋,訊息推送也成了週末去哪兒APP增加自己曝光量的一種重要手段。訊息推送的技術也日漸成熟,各種平臺紛紛出現,搶佔這一業務,本文就從技術角度來吐槽吐

WebSocket實現訊息

引言 最近專案中需要實現訊息推送需求,首先想到就是用webscket來實現IM,之前瞭解過這個東西,但是很久沒有用了,所以需要來弄個demo熱熱身,這樣在專案中使用的時候,會更靠譜些。先來看一下最後的效果:          一、Socket簡介 Socket又稱"套

藉助微信第三方實現訊息和提醒

一.前言 近來在負責微信端的專案開發,遇到了一個比較奇特的需求,使用者不想關注本公眾號(可能是怕隱私或者其他等等)但是還想收到推送給的訊息提醒。搜尋良久,最後在同事口中得知微信有專門實現這種功能的公眾號。 二.PushBear 基於微信模板的一對多訊息送達服務 API 就兩個引數  https:/

vue+socket實現訊息

前提:後臺已設定好socket訊息 首先在vue專案中引入socket。在npm下載socket。 npm install vue-socket.io 當然也可以在index.html中直接插入下面這句,但是最好不要這樣做。 <script src='https://cdn.bo

【小程式】如何實現訊息之收集

當訂單狀態變更時,小程式如何實現訊息推送來通知到使用者呢。微信開放了一個叫模板訊息的功能。  要實現訊息推送,分三步走 一、前期配置工作 二、前端工作 要實現推送訊息給使用者,就要有推送碼,官方API介紹提交一次表單有一次推送機會,完成一次支付行為有三次推送機

Springboot+websocket+定時器實現訊息

由於最近有個需求,產品即將到期(不同時間段到期)時給後臺使用者按角色推送,功能完成之後在此做個小結 1. 在啟動類中添加註解@EnableScheduling import org.mybatis.spring.annotation.MapperScan; import

企業微信簡單實現訊息

廢話不多說,上來就堆程式碼.......... 感覺挺簡單,就不過多解釋,應該一看就懂..... import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.uti

【轉 】workerman 實現訊息

WEB訊息推送框架 web-msg-sender是一款web長連線推送框架,採用PHPSocket.IO開發,基於WebSocket長連線通訊,如果瀏覽器不支援WebSocket則自動轉用comet推送。 通過後臺推送訊息,訊息可以即時推送到客戶端,非輪詢

酷炫MQTT實現訊息

首先在實現本功能之前我們需要儲備一下預備知識,大家可以看我的前兩篇文章以及官網,瞭解MQTT的基本常識: MQTT入門篇 在步入正題之前先給大家發放個福利,介紹一款MQTT外掛:MQTTLens 。 MQTTLens外掛的使用 1.安裝:

MQTT+ActiveMQ實現訊息(移動端)

這個小程式是我導師給我佈置的一個任務,網上教程不是很多,遇到的一些困難都是自己解決的,所以寫出來分享一下,有什麼問題大家可以留言,盡力幫大家解決。 來到解壓目錄下,進入bin目錄下的win64資料夾(如何是32位機器則進入win32),執行activemq

【websocket】springboot使用websocket實現訊息

首先我們引用Spring-boot所帶的websocket依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s

vs2010 編譯mosquitto win32版本,開啟websockets,實現訊息

廢話少說,開始~ 1. 下載vs2010 我下了個旗艦版的,不過只有30天試用期,無妨,編譯就夠了。 http://www.xpgod.com/soft/6637.html  ps:之前用過vs2008去編譯,然後各種莫名其妙,如果有同學知道為什麼的,請留言。

使用SpringBoot快速搭建WebSocket實現訊息

本文旨在幫助未掌握此技能的小白掃清障礙,快速搭建websocket訊息推送服務,高手請繞行。謝謝! 首先,筆者的寫作背景也是一名剛剛打通websocket訊息推送服務的小白。在連續幾日的蒐集資料下,最終在沒有找到一個完整的解決方案的情況下。摸索出正確的結果,倍

使用個實現訊息到客戶端

由於公司業務需要,也得學習一下個推的使用,在此記錄一下。 2、註冊完之後登入進去,之後你會獲得 appId 、appKey 、masterSecret 快速入門: private static String appId = ""; private static S

springboot整合websocket實現訊息.

springboot整合websocket實現訊息推送 1.maven配置 2.書寫後端程式碼 3.書寫前端程式碼 4.測試 1.maven依賴 <dependency> <groupId>org

Netty+WebSocket簡單實現訊息

依賴 <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifact

關於MQTT協議實現訊息系統

測試環境:  硬碟:1T,5400  (效果不佳) 得出了一個異樣的測試結果: 持久:  插入200000條JSON,共消耗:25.175 s 平均:7944.389275074478 條/秒 插入200000條JSON,共消耗:34.47 s 平均:5802.1467943138

MQTT+ActiveMQ實現訊息(伺服器端java實現

上一篇文章已經介紹了mqtt+activemq實現訊息推送移動端的實現,也介紹了利用自帶的web console進行訊息釋出的方法。但是在具體的專案應用中,當我們將需要將該訊息推送模組嵌入到一個後臺管理系統當中,我們就需要在web端來訪問activeMQ來進行訊

SignalR+HTML5實現訊息及Android通知欄訊息

最近在研究使用SignalR實現跨平臺的訊息中心,WebAPI+SignalR作為資料介面和訊息中心,客戶端包含WPF桌面應用、Web應用和Android移動應用。這其中關鍵的功能點在於接收到實時訊息後的通知提醒,桌面應用和Web應用實現相對簡單,Android

騰訊-信鴿實現訊息

信鴿Android SDK是一個能夠提供Push服務的開發平臺,提供給開發者簡便、易用的API介面,方便快速接入。 目前支援Android 2.2及以上版本系統。本文件將引導使用者以最快的速度嵌入信鴿SDK。 註冊&下載SDK 前往前臺 信鴿首頁,使用QQ號碼登陸,開啟註冊頁面,填寫“應用名稱”