
輪詢(xún)
客戶(hù)端定時(shí)向服務(wù)器發(fā)送Ajax請(qǐng)求,服務(wù)器接到請(qǐng)求后無(wú)論是否有響應(yīng)的數(shù)據(jù),都馬上返回響應(yīng)信息并關(guān)閉連接。
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單。
缺點(diǎn):浪費(fèi)帶寬和服務(wù)器資源,新數(shù)據(jù)響應(yīng)會(huì)有延遲。
應(yīng)用:小應(yīng)用小場(chǎng)景。
長(zhǎng)輪詢(xún)
與簡(jiǎn)單輪詢(xún)相似,只是在服務(wù)端在沒(méi)有新的返回?cái)?shù)據(jù)情況下不會(huì)立即響應(yīng),而會(huì)掛起,直到有數(shù)據(jù)或即將超時(shí)。
優(yōu)點(diǎn):實(shí)現(xiàn)也不復(fù)雜,同時(shí)相對(duì)輪詢(xún),節(jié)約帶寬。
缺點(diǎn):所以還是存在占用服務(wù)端資源的問(wèn)題,雖然及時(shí)性比輪詢(xún)要高,但是會(huì)在沒(méi)有數(shù)據(jù)的時(shí)候在服務(wù)端掛起,所以會(huì)一直占用服務(wù)端資源,處理能力變少。
應(yīng)用:一些早期的對(duì)及時(shí)性有一些要求的應(yīng)用:web IM 聊天。
SSE(Server Send Event)服務(wù)器推送
一個(gè)客戶(hù)端獲取新的數(shù)據(jù)通常需要發(fā)送一個(gè)請(qǐng)求到服務(wù)器,也就是向服務(wù)器請(qǐng)求的數(shù)據(jù)。使用 server-sent 事件,服務(wù)器可以在任何時(shí)刻向我們的客戶(hù)端推送數(shù)據(jù)和信息。這些被推送進(jìn)來(lái)的信息可以在這個(gè)客戶(hù)端上作為 Events + data 的形式來(lái)處理。
客戶(hù)端
EventSource 類(lèi)
使用 EventSource 類(lèi)接口來(lái)完成請(qǐng)求。
// /getData 為某個(gè)獲取數(shù)據(jù)的url
let source = new EventSource("/getData");
參考:https://developer.mozilla.org/en-US/docs/Web/API/EventSource
服務(wù)端
服務(wù)端需要做如下一些設(shè)置:
頭信息
"Content-type": "text/event-stream"
返回?cái)?shù)據(jù)格式
https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
ctx.body = `event: ping\ndata: {"time": "${new Date()}"}\n\n`