Polling、Long Polling、WebSocket

1、輪詢(Polling)
客戶端(通常指瀏覽器)定時(shí)向服務(wù)端發(fā)送請(qǐng)求。不論服務(wù)端返回的數(shù)據(jù)是否更新,是否有值,客戶端都會(huì)進(jìn)行處理,然后再下一時(shí)間點(diǎn)再繼續(xù)發(fā)送請(qǐng)求。常用方法定時(shí)器定時(shí)去請(qǐng)求。

function sendRequest() {
    $(function() {
        $.ajax({
            type: 'GET',
            url: "user/list",
            dataType: 'json',
            success: function(data) {
                console.log(data);
            }
        });
    });
}
// 定時(shí)請(qǐng)求 5s 輪詢一次
var timer = setInterval(function() {
    sendRequest();
}, 5000)

2、長(zhǎng)輪詢(Long-Polling)
客戶端在向服務(wù)端發(fā)起一次請(qǐng)求之后立刻掛起,一直到服務(wù)端數(shù)據(jù)有更新,服務(wù)端才主動(dòng)推送信息到客戶端。此周期內(nèi),客戶端不會(huì)發(fā)送多余的請(qǐng)求,服務(wù)端也不做處理,只保留基本連接信息,待服務(wù)器有更新推送給客戶端之后,客戶端處理之后,重新發(fā)起下一輪請(qǐng)求。

function sendRequest() {
    $(function() {
        $.ajax({
            type: 'GET',
            url: "user/list",
            dataType: 'json',
            success: function(data) {
                console.log(data);
                sendRequest(); // 再進(jìn)行下一次請(qǐng)求
            },
            complete: function(XMLHttpRequest, textStatus) {
                if (textStatus == 'timeout') { // 超時(shí)處理
                    sendRequest(); // 超時(shí)之后,重新請(qǐng)求
                }
            }
        });
    });
}

3、WebSocket
WebSocket是HTML5出的協(xié)議,基于HTTP協(xié)議的一個(gè)持久化的協(xié)議。只需要建立一次HTTP連接,服務(wù)端會(huì)一直知道客戶端的信息,主動(dòng)推送信息給客戶端。


websocket
// 服務(wù)端
const WebSocket = require('ws');
const WebSocketServer = WebSocket.Server;
const wss = new WebSocketServer({
    port: 3000
});
wss.on('connnection', function(ws) {
    console.log(`[Server] connection()`);
    ws.on('message', function(message) {
        console.log(`[Server] Received: ${message}` );
        ws.send(`Echo: ${message}`, (err) => {
            if (err) {
                console.log(`[Server] error: ${err}`);
            }
        })
    })
})
// 客戶端
var ws;
function webSockectTest() {
    if ('WebSocket' in window) {
        alert('該瀏覽器支持WebSocket');
        ws = new WebSocket('ws://localhost:3000/test');
        // 已連接,發(fā)送數(shù)據(jù)
        ws.onopen = function() {
            ws.send('發(fā)送數(shù)據(jù)');
            alert('數(shù)據(jù)發(fā)送中');
        };

        ws.onmessage = function(evt) {
            var receivedMsg = evt.data;
            alert('數(shù)據(jù)已接收' + receivedMsg);
        }

        ws.onerror = function(evt) {
            alert('Error:' + JSON.stringify(evt));
        }

        ws.onclose = function() {
            alert('連接已關(guān)閉');
        }

    } else {
        alert('該瀏覽器不支持WebSocket');
    }
}
webSockectTest();
方法 瀏覽器支持 服務(wù)器負(fù)載 客戶端負(fù)載 延遲 實(shí)現(xiàn)復(fù)雜度 優(yōu)點(diǎn) 缺點(diǎn) 例子
輪詢 幾乎所有瀏覽器 較少CPU資源;
較多內(nèi)存資源和帶寬資源;
占用較多的內(nèi)存資源 非實(shí)時(shí) 實(shí)現(xiàn)簡(jiǎn)單 后端程序容易編寫(xiě) 浪費(fèi)帶寬和服務(wù)器資源 小型應(yīng)用
長(zhǎng)輪詢 幾乎所有瀏覽器 與傳統(tǒng)相似 與傳統(tǒng)輪詢相似 同傳統(tǒng)輪詢 需要服務(wù)端配合,客戶端實(shí)現(xiàn)簡(jiǎn)單。 在無(wú)消息的情況下不會(huì)頻繁請(qǐng)求 服務(wù)器保持連接消耗資源 WebQQ
WebSocket IE10+
Firefox4+
Chrome4+
Safari5+
Opera11.5+
無(wú)需循環(huán)等待,CPU和內(nèi)存資源不以客戶端數(shù)量衡量,而是以客戶端事件數(shù)量衡量 同Server-Sent Event 實(shí)時(shí) 需要Socket程序?qū)崿F(xiàn)和額外端口,客戶端實(shí)現(xiàn)簡(jiǎn)單 建立一次連接之后,客戶端不要頻繁發(fā)請(qǐng)求,服務(wù)端主動(dòng)推送信息 需要有瀏覽器支持限制 需要實(shí)時(shí)性高的應(yīng)用

參考資料
輪詢與長(zhǎng)輪詢
WebSocket 原理與long poll、ajax輪詢
webSocket、Ajax輪詢、長(zhǎng)輪詢(long poll)
Ajax輪詢,Ajax長(zhǎng)輪詢和websocket(詳細(xì)使用)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • WebSocket簡(jiǎn)介 談到Web實(shí)時(shí)推送,就不得不說(shuō)WebSocket。在WebSocket出現(xiàn)之前,很多網(wǎng)站為...
    吧啦啦小湯圓閱讀 8,341評(píng)論 15 75
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,970評(píng)論 1 92
  • 在項(xiàng)目中用到socket.io在WEB端做消息推送,遂花了點(diǎn)時(shí)間看了socket.io實(shí)現(xiàn),做個(gè)簡(jiǎn)單分析,如有錯(cuò)漏...
    __七把刀__閱讀 30,267評(píng)論 20 54
  • 三個(gè)標(biāo)簽: 1.易效能踐行者 2.終身學(xué)習(xí)者:喜歡學(xué)習(xí)新鮮,好玩的事務(wù) 3.人生終極玩家:華特?迪士尼 (美國(guó)迪士...
    悅馨哈媽閱讀 243評(píng)論 0 0
  • 2017年8月13日,又到周末,《優(yōu)勢(shì)計(jì)劃》的例行周考又來(lái)了,我知道自己這周欠了2天讀書(shū)債,因?yàn)楸局艿臅?shū)...
    花琪兒閱讀 440評(píng)論 2 3

友情鏈接更多精彩內(nèi)容