国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

<li id="qs183"><wbr id="qs183"><ul id="qs183"></ul></wbr></li>
<li id="qs183"><dl id="qs183"></dl></li>
<code id="qs183"><delect id="qs183"></delect></code><li id="qs183"><dl id="qs183"></dl></li>
<tfoot id="qs183"></tfoot>
<rt id="qs183"><form id="qs183"><dfn id="qs183"></dfn></form></rt><li id="qs183"><dl id="qs183"></dl></li>
  • 0
    • 聊天消息
    • 系統消息
    • 評論與回復
    登錄后你可以
    • 下載海量資料
    • 學習在線課程
    • 觀看技術視頻
    • 寫文章/發帖/加入社區
    會員中心
    創作中心

    完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

    3天內不再提示

    web端的消息推送原理分析

    電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-25 17:50 ? 次閱讀
    加入交流群
    微信小助手二維碼

    掃碼添加小助手

    加入工程師交流群

    引言:

    在互聯網高速發展的時代里,web應用大有取代桌面應用的趨勢,不必再去繁瑣的安裝各種軟件,只需一款主流瀏覽器即可完成大部分常規操作,這些原因都在吸引著軟件廠商和消費者。而隨著各大廠商瀏覽器版本的迭代,前端技術的不斷革新,消息推送用到的場景也越來越多了。

    收發郵件提醒,在線IM聊天,自動化辦公提示等等,web系統里總是能見到消息推送的應用。消息推送用好了能增強用戶體驗,用不好則會起相反的效果。在司空見慣的使用過程中,有沒有對其中的原理產生興趣呢?實現消息推送有N種解決方案,本文針對其中的幾種,進行原理性的講解并附有簡單的代碼實現。

    目錄:

    一、什么是消息推送

    二、web端的消息推送

    、實現個性化的推送

    一、什么是消息推送

    經典場景1

    當我在官網觀望猶豫時,突然看到了上面消息,一位神秘的徐老板竟然爆出了麻痹戒指!!我的天,于是我果斷開始了游戲!這消息很及時!

    經典場景2

    當我拿起手機不知干嘛時收到了這條招女婿的消息,瞬間來了精神

    上述兩種場景,是生活中很常見的場景,通過圖文描述,應該已經清楚了推送的場景,也引出了兩大推送種類,web端消息推送移動端消息推送。接下來對消息推送進行具體的解釋。

    概念:

    消息推送(Push)指運營人員通過自己的產品或第三方工具對用戶當前網頁或移動設備進行的主動消息推送。用戶可以在網頁上或移動設備鎖定屏幕和通知欄看到push消息通知。以此來實現用戶的多層次需求,使得用戶能夠自己設定所需要的信息頻道,得到即時消息,簡單說就是一種定制信息的實現方式。我們平時瀏覽郵箱時突然彈出消息提示收到新郵件就屬于web端消息推送,在手機鎖屏上看到的微信消息等等都屬于APP消息推送。

    二、web端的消息推送

    這一章節主要對幾種消息推送的方式進行原理性的講解,并貼出簡單實現的代碼。

    主要介紹其中的五種實現方式:短輪詢、Comet、Flash XMLSocket、Server-sent、WebSocket。

    1、短輪詢

    指在特定的的時間間隔(如每10秒),由瀏覽器對服務器發出HTTP request,然后由服務器返回最新的數據給客戶端的瀏覽器。瀏覽器做處理后進行顯示。無論后端此時是否有新的消息產生,都會進行響應。字面上看,這種方式是最簡單的。這種方式的優點是,后端編寫非常簡單,邏輯不復雜。但是缺點是請求中大部分中是無用的,浪費了帶寬和服務器資源。總結來說,簡單粗暴,適用于小型(偷懶)應用。

    基于Jquery的ajax前端代碼:

    <body> <div id="push"></div> <script> $(function () { setInterval(function () { getMsg(function (res) { $("#push").append("<p>" + res +"</p>"); }) },10000); });
    function getMsg(handler){ $.ajax({ url:"/ShortPollingServlet", type:"post", success:function (res) { handler(res) } }); }</script></body>

    servlet簡單實現后端代碼:

    public class ShortPollingServlet extends HttpServlet {
    public static int count = 0;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //模擬業務代碼 count++; response.getWriter().print("msg:" + count ); }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }}

    (左右滑動查看全部代碼)

    2、Comet

    包括了長輪詢長連接,長輪詢是客戶端向服務器發送Ajax請求,服務器接到請求后hold住連接,直到有新消息才返回響應信息并關閉連接,客戶端處理完響應信息后再向服務器發送新的請求;長連接是在頁面中的iframe發送請求到服務端,服務端hold住請求并不斷將需要返回前端的數據封裝成調用javascript函數的形式響應到前端,前端不斷收到響應并處理。Comet的實現原理和短輪詢相比,很明顯少了很多無用請求,減少了帶寬壓力,實現起來比短輪詢復雜一丟丟。比用短輪詢的同學有夢想時,就可以用Comet來實現自己的推送。

    長輪詢的優點很明顯,在無消息的情況下不會頻繁的請求,耗費資小并且實現了服務端主動向前端推送的功能,但是服務器hold連接會消耗資源,返回數據順序無保證,難于管理維護。WebQQ(好像掛了)就是這樣實現的。

    基于Jquery的ajax前端代碼:

    <body> <div id="push"></div> <script> $(function () { getMsg(); });
    function getMsg() { $.ajax({ url:"/LongPollingServlet", type:"post", success:function (res) { $("#push").append("<p>" + res +"</p>"); getMsg(); } }); }</script></body>

    (左右滑動查看全部代碼)

    servlet簡單實現后端代碼:

    public class LongPollingServlet extends HttpServlet {
    public static int count = 0;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { count++; //睡眠時間模擬業務操作等待時間 double random = Math.round(Math.random()*10); long sleepTime = new Double(random).longValue(); try{ Thread.sleep(sleepTime*1000); response.getWriter().print("msg:" + count + " after " + sleepTime + "seconds servicing"); }catch (Exception e){ e.printStackTrace(); }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }}

    (左右滑動查看全部代碼)

    長連接優點是消息即是到達,不發無用請求,管理起來也相對方便。缺點是服務端維護一個長連接會增加開銷。比如Gmail聊天(沒用過)就是這樣實現的。

    基于Jquery的ajax前端代碼:

    <head> <title>pushPage</title> <script type="text/javascript"> function loadData(msg) { var newChild = document.createElement("p"); newChild.innerHTML = msg; document.getElementById("push").appendChild(newChild); }</script></head><body><div id="push"></div><iframe src="/LongConnServlet" frameborder="0" name="longConn"></iframe></body>

    (左右滑動查看全部代碼)

    servlet簡單實現后端代碼:

    public class LongConnServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean flag = true; int i = 0; while (flag){ try { //模擬每1秒查詢一次數據庫,看是否有新的消息可以推送 Thread.sleep(1*1000); }catch (Exception e){ e.printStackTrace(); }
    String pushMsg = "push msg : " + i; response.setContentType("text/html;charset=GBK"); response.getWriter().write("<script type='text/javascript'>parent.loadData('" + pushMsg + "')</script>"); response.flushBuffer(); i++; if(i==5){ flag = false; } } }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }}

    (左右滑動查看全部代碼)

    3、Flash XMLSocket

    在 HTML 頁面中內嵌入一個使用了 XMLSocket 類的 Flash 程序。JavaScript 通過調用此 Flash 程序提供的socket接口與服務器端的socket進行通信。JavaScript 在收到服務器端以 XML 格式傳送的信息后可以很容易地控制 HTML 頁面的內容顯示。

    原理示意圖

    利用Flash XML Socket實現”服務器推”技術前提:

    (1)Flash提供了XMLSocket類,服務器利用Socket向Flash發送數據;

    (2)JavaScript和Flash的緊密結合JavaScript和Flash可以相互調用。

    優點是實現了socket通信,不再利用無狀態的http進行偽推送。但是缺點更明顯:

    1.客戶端必須安裝 Flash 播放器;

    2.因為 XMLSocket 沒有 HTTP 隧道功能,XMLSocket 類不能自動穿過防火墻;

    3.因為是使用套接口,需要設置一個通信端口,防火墻、代理服務器也可能對非 HTTP 通道端口進行限制。

    這種方案在一些網絡聊天室,網絡互動游戲中已得到廣泛使用。不進行代碼示例。(可參考http://t.cn/aezSch)

    4、Server-sent

    服務器推指的是HTML5規范中提供的服務端事件EventSource,瀏覽器在實現了該規范的前提下創建一個EventSource連接后,便可收到服務端的發送的消息,實現一個單向通信。客戶端進行監聽,并對響應的信息處理顯示。該種方式已經實現了服務端主動推送至前端的功能。優點是在單項傳輸數據的場景中完全滿足需求,開發人員擴展起來基本不需要改后端代碼,直接用現有框架和技術就可以集成。

    基于HTML5的Server-sent事件:

    <head> <title>Title</title> <script> var source = new EventSource("/ServerSentServlet");//創建一個新的 EventSource對象, source.onmessage = function (evt) {//每接收到一次更新,就會發生 onmessage事件 var newChild = document.createElement("p"); newChild.innerHTML = evt.data; document.getElementById("push").appendChild(newChild); }</script></head><body> <div id="push"></div></body>

    (左右滑動查看全部代碼)

    servlet簡單實現后端代碼:

    public class ServerSentServlet extends HttpServlet {
    public static int count = 0;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { count++; response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type", "text/event-stream");//設置服務器端事件流 response.setHeader("Cache-Control","no-cache");//規定不對頁面進行緩存 response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires",0); PrintWriter pw = response.getWriter(); pw.println("retry: 5000"); //設置請求間隔時間 pw.println("data: " + "msg:" + count +""); }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }}

    (左右滑動查看全部代碼)

    5、WebSocket

    WebSocket是HTML5下一種新的協議,是基于TCP的應用層協議,只需要一次連接,便可以實現全雙工通信,客戶端和服務端可以相互主動發送消息。客戶端進行監聽,并對響應的消息處理顯示。這個技術相信基本都聽說過,就算沒寫過代碼,也大概知道干嘛的。通過名字就能知道,這是一個Socket連接,一個能在瀏覽器上用的Socket連接。是HTML5標準中的一個內容,瀏覽器通過javascript腳本手動創建一個TCP連接與服務端進行通訊。優點是雙向通信,都可以主動發送消息,既可以滿足“問”+“答”的響應機制,也可以實現主動推送的功能。缺點就是編碼相對來說會多點,服務端處理更復雜(我覺得當一條有情懷的咸魚就應該用這個!)。

    前端代碼:

    <body> <div id="push"></div></body><script> $(function () { var webSocket = new WebSocket("ws://localhost:8080/ws"); webSocket.onmessage = function (ev) { $("#push").append("<p>" + ev.data +"</p>"); } })</script>

    (左右滑動查看全部代碼)

    基于注解簡單實現后端代碼:

    @ServerEndpoint("/ws")public class MyWebSocket {
    private Session session;
    public MyWebSocket() {

    @OnOpen public void onOpen(Session session) { this.session = session; System.out.println("someone connect"); int count = 1; while (count<=5){ //睡眠時間模擬業務操作等待時間 double random = Math.round(Math.random()*10); long sleepTime = new Double(random).longValue(); try { Thread.sleep(sleepTime*1000); session.getBasicRemote().sendText("msg:" + count +" from server after" + sleepTime + " seconds"); }catch (Exception e){ e.printStackTrace(); } count++; }

    @OnError public void onError(Throwable t){ System.out.println("something error"); }}

    (左右滑動查看全部代碼)

    以上是對五種推送方式原理的簡單講解和代碼的實現。

    三、實現個性化的推送

    上面說了很多原理,也給出了簡單的代碼實現,但是在實際生產過程中,肯定不能用上面的代碼,針對自己系統的應用場景選擇合適的推送方案才是合理的,因此最后簡單說一下實現個性化推送的兩種方式。第一種很簡單,直接使用第三方實現的推送,無需復雜的開發運維,直接可以使用。第二種就是自己封裝,可以選擇如今較為火熱的WebSocket來實現系統的推送。

    1、第三方

    在這里推薦一個第三方推送平臺,GoEasy。

    推薦理由是GoEasy的理念符合我們的選擇(可參考http://t.cn/Ex6jg3q):

    (1)更簡單的方式將消息從服務器端推送至客戶端

    (2)更簡單的方式將消息從各種客戶端推送至客戶端

    GoEasy具體的使用方式這里不再贅述,詳見官網。對于后端后端開發者,可直接使用Rest方式調用推送,對于前端或web開發者,可以從web客戶端用javascript腳本進行調用推送。

    2、封裝自己的推送服務

    如果是一個老系統進行擴展,那么更推薦使用Server-sent,服務端改動量不會很大。如果是新系統,更推薦websocket,實現的功能功能更全面。

    我們以websocket為例,不再貼出具體的代碼實現。

    我們如果需要使用websocket技術實現自己的推送服務,需要注意哪些點,或者說需要踩哪些坑呢,本文最后列出幾點供大家參考:

    長連接的心跳處理;

    從WebSocket中獲取HttpSession進行用戶相關操作;

    服務端調優實現高并發量client同時在線;

    服務端維持多用戶的狀態;

    群發消息;

    等等等….

    最后貼出上述代碼的git庫地址,所有demo均可運行。環境為jdk1.8+tomcat8。

    http://t.cn/Ex6TRVZ

    精選提問:

    問1:請問,分布式下的信息推送適合用哪種,信息推送和訂閱有什么區別?

    答:分布式下我覺得websocket。訂閱是索取消息,推送是主動推送消息。

    問2:掃碼登錄是使用websocket實現的嗎?

    答:實現掃碼登陸可以多種方式。輪詢可以,websocket也可以,看自己選擇。

    推薦閱讀

    RESTful API教程:學習關鍵的Web服務設計原則

    React-native如何變為移動端的弄潮兒

    使用消息系統進行微服務間通訊時,如何保證數據一致性

    關于作者:徐曉明,普元開發工程師,畢業于遼寧科技大學,專注于使用移動開發平臺開發app,負責中國郵政集團移動平臺項目郵我行app開發和后臺開發運維工作。

    審核編輯:符乾江
    聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
    • Web
      Web
      +關注

      關注

      2

      文章

      1306

      瀏覽量

      74501
    • 代碼
      +關注

      關注

      30

      文章

      4968

      瀏覽量

      74010
    收藏 人收藏
    加入交流群
    微信小助手二維碼

    掃碼添加小助手

    加入工程師交流群

      評論

      相關推薦
      熱點推薦

      動作捕捉和盲人導航眼鏡的接合與應用,web的開發代碼和調試步驟

      硬件對接。 核心整合邏輯 硬件層 :導航眼鏡的攝像頭采集視覺幀、IMU 采集頭部 / 肢體姿態、麥克風接收語音指令,通過WebSocket將數據實時推送Web 后端; 后端層 :集成
      發表于 02-02 07:10

      蔚來世界模型NWM全新版本正式推送

      2026年1月28日,「蔚來世界模型 NWM」全新版本正式開啟推送,首批將為超過46萬輛「Banyan 榕」車型推送。「Cedar 雪松」車型及「Cedar S 雪松」車型,也將于近期開啟推送
      的頭像 發表于 01-28 15:38 ?422次閱讀

      電能質量在線監測裝置的數據推送頻率可以手動調整嗎?

      / 新能源并網)設置獨立的推送周期。 一、調整方式與配置途徑 配置方式 操作方法 適用場景 本地 Web 界面 通過裝置自帶以太網口訪問內置 Web 服務器,在 "通信設置" 或 "數據推送
      的頭像 發表于 12-05 15:08 ?331次閱讀
      電能質量在線監測裝置的數據<b class='flag-5'>推送</b>頻率可以手動調整嗎?

      電能質量在線監測裝置支持的數據推送頻率是多少?

      電能質量在線監測裝置的數據推送頻率 可靈活配置 ,根據數據類型(穩態 / 暫態 / 事件)和應用場景(電網關口 / 工業用戶 / 新能源并網)的不同, 覆蓋從毫秒級到小時級的廣泛范圍 ,主流裝置支持
      的頭像 發表于 12-05 15:07 ?418次閱讀
      電能質量在線監測裝置支持的數據<b class='flag-5'>推送</b>頻率是多少?

      電能質量在線監測裝置的數據推送頻率調整會影響數據的準確性嗎?

      電能質量在線監測裝置的數據推送頻率調整對數據準確性的影響需從 采樣、處理、傳輸 三個核心環節綜合評估,其關鍵取決于 調整策略與裝置設計的匹配度 。以下是基于技術原理與工程實踐的詳細分析: 一、核心
      的頭像 發表于 11-07 11:08 ?667次閱讀

      常用Web 實時通信技術:原理+選型,一篇通關

      Web 開發中,實時通信技術的核心目標是實現客戶(Browser)與服務器之間低延遲、雙向 / 單向的動態數據交互,而非傳統 HTTP 的 “請求 - 響應” 模式。以下是 Web
      的頭像 發表于 10-27 17:19 ?873次閱讀
      常用<b class='flag-5'>Web</b> 實時通信技術:原理+選型,一篇通關

      蔚來模型化架構如何大幅提升安全上限

      2024年7月,蔚來將行業首個基于模型化架構的「自動緊急制動 AEB」推送上車,蔚來也成為了行業首家使用模型化架構來做主動安全的
      的頭像 發表于 08-15 15:35 ?930次閱讀

      【EASY EAI Orin Nano開發板試用體驗】使用stream推流代碼和WEB服務器代碼實現在客戶網頁上查看攝像頭圖像

      本帖最后由 donatello1996 于 2025-8-13 20:32 編輯 【EASY EAI Orin Nano開發板試用體驗】使用stream推流代碼和WEB服務器代碼實現在客戶
      發表于 08-11 23:15

      從 app_gatt_callback調用這個隊列推送函數時,程序出現了硬故障怎么解決?

      ,其大小為 intptr_t。 當我從 \" app_bt_management_c \" allback 調用隊列推送 API 時,我的程序可以正常工作。 但是當我從 app_gatt_callback 調用這個隊列推送函數時,我的程序出現了硬故障。
      發表于 07-04 06:03

      推進電機蓋結構的抗沖擊分析及優化

      摘要:高轉矩密度、強抗沖擊性和低噪聲已經成為艦船用推進電機三大特征,以某推進電機的蓋結構為分析研究對象,以有限元數值仿真分析為手段,分析了該結構在受到沖擊時的反應及隨材料屬性變化的規
      發表于 06-23 07:12

      WEB組態物聯網平臺是什么?有什么功能?

      WEB組態物聯網平臺是一種基于Web技術的物聯網(IoT)可視化管理與監控平臺,它將 組態軟件 的靈活配置能力與 物聯網技術 的數據采集、傳輸、分析功能相結合,通過瀏覽器即可實現設備監控、數據展示
      的頭像 發表于 06-17 15:25 ?990次閱讀

      鴻蒙5開發寶藏案例分享---Web頁面內點擊響應時延分析

      ! ??** 二、性能分析工具鏈** DevTools時間線 - 定位卡頓區域 // 開啟性能監測(在Web頁面注入) console.time(\'clickRendering\'); // ...業務
      發表于 06-12 17:09

      蔚來世界模型NWM首個版本正式推送

      近日,「蔚來世界模型 NWM」首個版本正式開啟推送。首批推送車型為超過40萬臺的「Banyan 榕」車型。「Cedar 雪松」車型,包括ET9、新ES6、新EC6、新ET5、新ET5T在內,將會于6月底開啟推送
      的頭像 發表于 06-04 15:13 ?931次閱讀

      基于 HT for Web 的輕量化 3D 數字孿生數據中心解決方案

      ,支持 PC、移動瀏覽器直接訪問,兼容主流操作系統。 輕量化建模體系 : 支持 CAD、BIM 模型導入,通過幾何簡化、紋理壓縮等算法降低模型復雜度,適配 Web 渲染性能。 提供參數化建模工具,可
      的頭像 發表于 05-30 14:33 ?905次閱讀
      基于 HT for <b class='flag-5'>Web</b> 的輕量化 3D 數字孿生數據中心解決方案

      小米汽車智駕技術介紹

      后起之秀,小米在宣布造車前被非常多的人質疑,但在“真香”定律下,小米創下了很多友商所不能及的成就。作為科技企業,小米也在智能駕駛領域也不斷研發及突破,并推送自動駕駛系統。 小米
      的頭像 發表于 03-31 18:17 ?5279次閱讀
      小米汽車<b class='flag-5'>端</b>到<b class='flag-5'>端</b>智駕技術介紹