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ì)使用)