Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 久久久91精品国产一区二区 ,亚洲视频1区,亚洲一区二区三区高清视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          網頁端的消息接收,用什么方式好呢?

          網頁端的消息接收,用什么方式好呢?

          頁收發消息是一個常見的系統應用場景,通常我們有兩種方式來完成消息的發送,一種是通過客戶端來拉取消息,一種是服務端推送消息,到底使用哪種方式好一點呢?

          具體使用哪種方式,我們需要根據實際的業務場景來分析,沒有絕對正確的方式,只有適不適合。所以,我們分析一下網頁端的用戶一般都存在哪些應用場景:

          1. 系統將通知發送給用戶——這種場景下,用戶對于消息的實時性要求并不高
          2. 用戶和用戶之間發送聊天消息——這種場景下,用戶就對實時性的要求很高了,越實時越好

          我們拋開純技術實現不談,只是從解決方案來談,由于是使用的是網頁端,HTTP協議是通過“請求-響應”的方式傳遞,網頁端和服務端之間是沒有消息通道的,那么怎么來實現消息的接收呢?

          輪詢拉取

          輪詢拉取可以說是所有消息的實現方案中最簡單的一種,實現起來也非常簡單。


          大致的實現方法如下:

          1. 發送方發送消息后,消息先進入隊列中暫存(也可以是數據庫)
          2. 網頁端建立一個timer,固定時間(例如:30秒)輪詢到隊列(或數據庫)中拉取消息
          3. 無論有沒有拉到消息,收到返回的消息后,30秒后再次輪詢拉取

          這種方式最大的優勢就是實現非常簡單,而且容易理解,早期的聊天室基本都是這種實現方式,我曾經給朋友做過一個答題的系統,有多個終端,每個終端看到的內容需要有所不同,也是使用的這種實現方式。

          當然這種實現方式的缺點也是非常明顯:

          1. 時效性差:隨著timer間隔時間的長短,收到消息的延時時間會被拉長,以30秒為例,消息最大的延時就會達到30秒
          2. 效率差:網頁端會不停的請求服務器,但是發消息的頻率事實上并沒有這么高,如果10次輪詢才拉到一條消息,那么有效性只有10%,大量的浪費了服務器資源

          使用這種方式,時效性和效率是矛盾的,我降低timer的間隔時間,就可以提高時效性,但是會降低效率,例如:間隔時間降低到1秒,這種基本就可以趨近于實時了,但是可能300次輪詢才會拉到1條消息,有效性只有0.3%了。

          所以,由于這個不可調和的矛盾存在,這種解決方案只能適用于一些同時在線用戶少,對實時性要求不高的場景中。

          長連接

          如果想要同時保證時效性和效率,其實長連接是一個不錯的選擇,一般我們的PC端聊天軟件都是使用的長連接方式來實現。而網頁端的長連接實現方式通常有兩種:

          1. WebSocket
          2. FlashSocket

          FlashSocket就不說了,如果不是網頁游戲的話其實很少會用到這個方案來做長連接,它要求用戶必須安裝了Flash插件。如果是HTML網頁端的話,其實更多會選擇WebSocket這種方案,WebSocket的優點非常明顯,建立一次握手以后,服務端和網頁端就可以雙向通信了,擺脫了HTTP的Request-Response的限制,消息的及時性和效率都大幅度的提升了。

          但是WebSocket也不是那么簡單,其中的坑也非常的多,如何單個生產者推送給多個消費者,如何保證不重復推送,斷線以后的重連等等。當然更重要的是,不同的瀏覽器對于WebSocket的支持可能不同,兼容性也是一大問題,所以使用得并不是很多。

          那有沒有一種更常用的方法來處理消息的接收呢?

          HTTP長輪詢

          想要建立一條HTTP長輪詢的通道,我們需要在瀏覽器和服務器之間建立一條通知連接。

          而這條通知連接不同于普通的HTTP連接,它要有一些特殊性:

          1. 這個HTTP連接只能用來收取推送的消息
          2. 不同于普通的Request-Response HTTP請求,這個HTTP連接不會馬上響應,會先被Hold在這里,知道接到通知的消息或者超過了約定的時間(我們都知道,HTTP請求是會有超時的,一般我們都會設置一個請求超時的閾值,如果超過這個閾值,那么請求就會被粗暴的斷開,返回一個錯誤消息,為了保證我們的請求不被粗暴的對待,我們需要在超時之前優雅的返回一個結果)

          怎么來Hold住這個請求呢?

          場景一:隊列里面有消息


          1. 發起一個通知連接HTTP請求
          2. 發現消息隊列里面有消息,于是拿到消息然后立刻返回
          3. 收到返回的消息后,立刻再次發起通知連接的請求

          場景二:隊列里面沒有消息


          1. 發起一個通知連接HTTP請求
          2. 發現消息隊列里面沒有消息,于是一直等待直到達到時間閾值然后返回
          3. 收到返回的消息后,立刻再次發起通知連接的請求

          個人認為,長輪詢的請求就一直保持對消息隊列的數據拉取就行,如果有實時的消息來了,也等到它進入消息隊列以后再處理,這樣可以防止消息丟失,也可以降低系統的復雜度。

          總的來說,網頁端的消息接收,用什么方式好呢?拉和推都可以,每種方式有每種方式的優缺點。

          1. 如果業務不復雜,實時性不高,建議輪詢拉取
          2. 最佳方案是推,但是WebSocket和FlashSocket各有局限性,實現起來也麻煩一點
          3. 常見方式就是長輪詢,需要開辟一條專用的消息通道

          融界2024年7月9日消息,天眼查知識產權信息顯示,稅友軟件集團股份有限公司取得一項名為“一種數據交互方法、系統、電子設備及存儲介質“,授權公告號CN113010237B,申請日期為2021年3月。

          專利摘要顯示,本發明公開了一種數據交互方法,包括:HTML程序利用HTML容器提供的服務接口生成本地資源獲取請求,并通過HTML容器的容器進程將本地資源獲取請求發送至本地服務容器;本地服務容器利用本地服務容器中包含的業務服務對接收到的本地資源獲取請求進行處理,得到相應的本地資源數據,并將本地資源數據發送至HTML容器;HTML容器接收本地資源數據,并將本地資源數據發送至HTML程序;本方法中的HTML程序可直接使用HTML容器及本地服務容器進行本地資源獲取,可確保HTML程序擺脫HTTP服務的束縛,以使HTML能夠更好地在本地程序中進行應用;本發明還提供數據交互系統、電子設備及存儲介質,具有上述有益效果。

          本文源自金融界

          覽器解析HTML文件的過程是網頁呈現的關鍵步驟之一。具體介紹如下:


          HTML文檔的接收和預處理

          1. 網絡請求處理:當用戶輸入URL或點擊鏈接時,瀏覽器發起HTTP請求,服務器響應并返回HTML文件。此過程中,瀏覽器需要處理DNS查詢、建立TCP連接等底層網絡通信操作。
          2. 預解析優化:為了提高性能,現代瀏覽器在主線程解析HTML之前會啟動一個預解析線程,提前下載HTML中鏈接的外部CSS和JS文件。這一步驟確保了后續渲染過程的順暢進行。

          解析為DOM樹

          1. 詞法分析和句法分析:瀏覽器的HTML解析器通過詞法分析將HTML文本標記轉化為符號序列,然后通過句法分析器按照HTML規范構建出DOM樹。每個節點代表一個HTML元素,形成了多層次的樹狀結構。
          2. 生成對象接口:生成的DOM樹是頁面元素的結構化表示,提供了操作頁面元素的接口,如JavaScript可以通過DOM API來動態修改頁面內容和結構。

          CSS解析與CSSOM樹構建

          1. CSS文件加載與解析:瀏覽器解析HTML文件中的<link>標簽引入的外部CSS文件和<style>標簽中的內聯CSS,生成CSSOM樹。CSSOM樹反映了CSS樣式的層級和繼承關系。
          2. CSS屬性計算:包括層疊、繼承等,確保每個元素對應的樣式能夠被準確計算。這些計算過程為后續的布局提供必要的樣式信息。

          JavaScript加載與執行

          1. 阻塞式加載:當解析器遇到<script>標簽時,它會停止HTML的解析,轉而先加載并執行JavaScript代碼。這是因為JS可能會修改DOM結構或CSSOM樹,從而影響已解析的部分。
          2. 異步和延遲加載:為了不影響頁面的初步渲染,可以采用async或defer屬性來異步加載JS文件,這樣可以在后臺進行JS的加載和執行,而不阻塞HTML解析。

          渲染樹的構建

          1. 合并DOM樹和CSSOM樹:有了DOM樹和CSSOM樹后,瀏覽器將它們組合成渲染樹,這個樹只包含顯示界面所需的DOM節點及對應的樣式信息。
          2. 不可見元素的排除:渲染樹會忽略例如<head>、<meta>等不可見元素,只關注<body>內的可視化內容。

          布局計算(Layout)

          1. 元素位置和尺寸確定:瀏覽器從渲染樹根節點開始,遞歸地計算每個節點的精確位置和尺寸,這個過程也被稱為“回流”或“重排”,是后續繪制的基礎。
          2. 布局過程的優化:現代瀏覽器會盡量優化布局過程,例如通過流式布局的方式減少重復計算,確保高效地完成布局任務。

          繪制(Paint)

          1. 像素級繪制:繪制是一個將布局計算后的各元素繪制成像素點的過程。這包括文本、顏色、邊框、陰影以及替換元素的繪制。
          2. 層次化的繪制:為了高效地更新局部內容,瀏覽器會將頁面分成若干層次(Layer),對每一層分別進行繪制,這樣只需更新變化的部分。

          因此,我們開發中要注意以下幾點:

          • 避免過度使用全局腳本:盡量減少使用全局腳本或者將它們放在文檔底部,以減少對HTML解析的阻塞。
          • 合理組織CSS和使用CSS預處理器:合理組織CSS文件的結構和覆蓋規則,利用CSS預處理器進行模塊化管理。
          • 利用瀏覽器緩存機制:通過設置合理的緩存策略,減少重復加載相同資源,提升二次訪問的體驗。
          • 優化圖片和多媒體資源:適當壓縮圖片和優化多媒體資源的加載,減少網絡傳輸時間和渲染負擔。

          綜上所述,瀏覽器解析HTML文件是一個復雜而高度優化的過程,涉及從網絡獲取HTML文檔到最終將其渲染到屏幕上的多個步驟。開發者需要深入理解這些步驟,以優化網頁性能和用戶體驗。通過合理組織HTML結構、優化資源加載順序、減少不必要的DOM操作和合理安排CSS和JavaScript的加載與執行,可以顯著提升頁面加載速度和運行效率。


          主站蜘蛛池模板: AV天堂午夜精品一区二区三区| 精品成人一区二区三区免费视频 | 亲子乱av一区区三区40岁| 日本一区二区三区四区视频| 国产无套精品一区二区| 精品国产区一区二区三区在线观看 | 久久国产午夜精品一区二区三区| 亚洲欧洲一区二区| 国产成人精品无人区一区 | 日本精品高清一区二区2021| 亚洲一区二区久久| 亚洲国产国产综合一区首页| 国产激情精品一区二区三区| 国产一区二区精品久久岳√| 风间由美在线亚洲一区| 丰满爆乳无码一区二区三区| 伦精品一区二区三区视频| 亚洲欧洲精品一区二区三区| 日韩亚洲AV无码一区二区不卡| 亚州日本乱码一区二区三区| 亚洲av无码一区二区三区不卡 | 亚洲精品无码一区二区| 精品无码一区二区三区在线| 亚洲综合色一区二区三区小说 | 精品人妻少妇一区二区| 丰满岳乱妇一区二区三区| 日韩精品一区二区午夜成人版| 国产一区二区在线观看麻豆| 美女视频免费看一区二区| 一区国严二区亚洲三区| 区三区激情福利综合中文字幕在线一区| 精彩视频一区二区三区 | 国产一区二区影院| 成人乱码一区二区三区av| 久久精品国产一区二区三区日韩| 久久久久一区二区三区| 91香蕉福利一区二区三区| 毛片无码一区二区三区a片视频| 在线日韩麻豆一区| 亚洲AV无码一区二三区| 亚洲AV无码一区二区二三区入口|