前言
Socket.IO 是一個(gè)用來實(shí)現(xiàn)實(shí)時(shí)雙向通信的框架,其本質(zhì)是基于 WebSocket 技術(shù)。
我們首先來聊聊 WebSocket 技術(shù),先設(shè)想這么一個(gè)場(chǎng)景:
· 用戶小A,打開了某個(gè)網(wǎng)站的充值界面,該界面上有一個(gè)付款的二維碼。
· 當(dāng)小A 用某寶的 APP 掃碼付款之后,網(wǎng)頁(yè)要自動(dòng)跳轉(zhuǎn)到付款成功的界面。最簡(jiǎn)單的方法就是網(wǎng)頁(yè)每隔一段時(shí)間就請(qǐng)求一次服務(wù)器——“怎么樣?那貨付款沒有?”,“怎么樣?還沒付嗎?”,“怎么樣?這次總該付了吧”。
· 當(dāng)接收到服務(wù)端返回確認(rèn)付款的標(biāo)識(shí)后,頁(yè)面再進(jìn)行跳轉(zhuǎn)。
這種定時(shí)對(duì)服務(wù)端發(fā)送 HTTP 請(qǐng)求的技術(shù)也被稱為“輪詢”。輪詢的缺點(diǎn)也顯而易見,短時(shí)間內(nèi)的多次訪問無疑會(huì)對(duì)服務(wù)器造成很大壓力。
后來,人們發(fā)明了長(zhǎng)輪詢技術(shù)。這與短輪詢的區(qū)別在于,每次瀏覽器請(qǐng)求服務(wù)器后,服務(wù)器并不會(huì)立即返回“用戶還未付款”的結(jié)果,而是一直將 HTTP 保持在掛起狀態(tài),只有當(dāng)用戶付款后才會(huì)返回給瀏覽器 “用戶已經(jīng)付款” 的結(jié)果。當(dāng)然,如果用戶在規(guī)定時(shí)間內(nèi)仍未付款還是會(huì)斷開此次連接,