摘要:在標(biāo)準(zhǔn)沒有推出之前,輪詢是唯一可行的方式通過瀏覽器也可以,但這里不做討論。這種方式存在延時(shí)且對(duì)服務(wù)端造成很大負(fù)載。直到年,才標(biāo)準(zhǔn)化一種基于套接字進(jìn)行收發(fā)數(shù)據(jù)的協(xié)議?,F(xiàn)如今主流瀏覽器均已支持。
socket.io提供了基于事件的實(shí)時(shí)雙向通訊
歷史Web端與服務(wù)器間的實(shí)時(shí)數(shù)據(jù)傳輸?shù)氖且粋€(gè)很重要的需求,但最早只能通過AJAX輪詢?cè)儗?shí)現(xiàn)。在WebSocket標(biāo)準(zhǔn)沒有推出之前,AJAX輪詢是唯一可行的方式(通過Flash瀏覽器也可以,但這里不做討論)。AJAX輪詢?cè)硎窃O(shè)置定時(shí)器,定時(shí)通過AJAX同步服務(wù)器數(shù)據(jù)。這種方式存在延時(shí)且對(duì)服務(wù)端造成很大負(fù)載。直到2011年,IETF才標(biāo)準(zhǔn)化WebSocket——一種基于TCP套接字進(jìn)行收發(fā)數(shù)據(jù)的協(xié)議。現(xiàn)如今主流瀏覽器均已支持WebSocket。
socket.io將數(shù)據(jù)傳輸部分獨(dú)立出來(lái)形成了engine.io, engine.io對(duì)WebSocket和AJAX輪詢進(jìn)行封裝,形成一套API,屏蔽了細(xì)節(jié)差異和兼容性問題,實(shí)現(xiàn)了跨瀏覽器/跨設(shè)備進(jìn)行雙向數(shù)據(jù)。
應(yīng)用socket.io對(duì)engine.io不是必須的,你也可以實(shí)現(xiàn)自己的engine.io,通過server.bind綁定
實(shí)時(shí)數(shù)據(jù)分析展示(報(bào)表,日志)
即時(shí)通訊、聊天,
二進(jìn)制流(圖片,音樂,視頻)傳輸
多人協(xié)同編輯
即時(shí)消息推送
類似技術(shù)AJAX輪詢: 基于XMLHttpRequest的AJAX輪詢
AJAX長(zhǎng)輪詢: 類似輪詢,服務(wù)器在客戶端請(qǐng)求后不返回響應(yīng),直到有數(shù)據(jù)需要傳到客戶端,傳完數(shù)據(jù)后客戶端再發(fā)起新的請(qǐng)求。缺點(diǎn)是要額外傳輸?shù)腍TTP頭,保持住請(qǐng)求不響應(yīng)也需要一些額外工作。
HTTP流: 與AJAX長(zhǎng)輪詢類似,服務(wù)端響應(yīng)會(huì)帶上HTTP頭: Transfer-Encoding: chunked,返回完數(shù)據(jù)到客戶端后客戶端也不需要發(fā)起新的請(qǐng)求,缺點(diǎn)是各個(gè)chunk之間的數(shù)據(jù)難以識(shí)別和處理。
插件: 類似Flash,Silverlight, 作為插件越來(lái)越被主流瀏覽器和用戶排斥
下面就不同角度對(duì)各技術(shù)進(jìn)行分析
單向/雙向
單向: AJAX輪詢,AJAX長(zhǎng)輪詢,HTTP流
雙向: WebSocket, 插件
延時(shí)
WebSocket < 插件 < HTTP流 < AJAX長(zhǎng)輪詢 < AJAX輪詢
效率
插件 > WebSocket > HTTP流 > AJAX長(zhǎng)輪詢 > AJAX輪詢
移動(dòng)端支持
WebSocket: 基本均支持
HTTP流,AJAX長(zhǎng)輪詢,AJAX輪詢: 基本均支持
插件: 基本不支持
開發(fā)或設(shè)置難易程度
WebSocket < AJAX輪詢 < 插件 < AJAX長(zhǎng)輪詢,HTTP流
結(jié)論socket.io封裝了WebSocket,不支持WebSocket的情況還提供了降級(jí)AJAX輪詢,功能完備,設(shè)計(jì)優(yōu)雅,是開發(fā)實(shí)時(shí)雙向通訊的不二手段。
更多文章的目錄在這里
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82558.html
摘要:這個(gè)文件事件處理器是單線程的,所以叫做單線程模型,采用多路復(fù)用機(jī)制同時(shí)監(jiān)聽多個(gè),根據(jù)上的事件來(lái)選擇對(duì)應(yīng)的事件處理器處理這個(gè)事件。 為什么使用緩存 優(yōu)點(diǎn): 高性能 高并發(fā) MySQL天然對(duì)高并發(fā)不好,MySQL單機(jī)支撐2000qps也開始容易報(bào)警,可以使用緩存,讓數(shù)據(jù)查詢從緩存中拿出數(shù)據(jù) 缺點(diǎn): 緩存的數(shù)據(jù)和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致 緩存雪崩 緩存穿透 緩存并發(fā)競(jìng)爭(zhēng) redis 和m...
摘要:阻塞當(dāng)進(jìn)行讀寫時(shí),線程是阻塞的狀態(tài)。當(dāng)任何一個(gè)收到數(shù)據(jù)后,中斷程序?qū)酒疬M(jìn)程。接收數(shù)據(jù)當(dāng)收到數(shù)據(jù)后,中斷程序會(huì)給的就緒列表添加引用。當(dāng)接收到數(shù)據(jù),中斷程序一方面修改,另一方面喚醒等待隊(duì)列中的進(jìn)程,進(jìn)程再次進(jìn)入運(yùn)行狀態(tài)如下圖。 本篇文章目的在于基本概念和原理的解釋,不會(huì)貼過多的使用代碼。 什么是NIO Java NIO (New IO)是 Java 的另一個(gè) IO API (來(lái)自 jav...
摘要:為了達(dá)到這種雙向的實(shí)時(shí)消息傳遞,很明顯地考慮用來(lái)實(shí)現(xiàn)。注意這個(gè)文件并不能用在實(shí)際的項(xiàng)目中,只是用來(lái)顯示消息推送的效果而已。參考資料本文在我博客上的原地址利用實(shí)現(xiàn)消息實(shí)時(shí)推送 項(xiàng)目背景介紹 最近在寫的項(xiàng)目中存在著社交模塊,需要實(shí)現(xiàn)這樣的一個(gè)功能:當(dāng)發(fā)生了用戶被點(diǎn)贊、評(píng)論、關(guān)注等操作時(shí),需要由服務(wù)器向用戶實(shí)時(shí)地推送一條消息。最終完成的項(xiàng)目地址為:socket-message-push,這里...
閱讀 2168·2021-10-08 10:15
閱讀 1197·2019-08-30 15:52
閱讀 524·2019-08-30 12:54
閱讀 1542·2019-08-29 15:10
閱讀 2695·2019-08-29 12:44
閱讀 3017·2019-08-29 12:28
閱讀 3365·2019-08-27 10:57
閱讀 2224·2019-08-26 12:24