WebSocket分享

1.開(kāi)篇

以下為我之前給組內(nèi)分享的有關(guān)WebSocket的話題,略有刪減糕簿,未完待續(xù)探入。。懂诗。

001

長(zhǎng)期以來(lái)蜂嗽,在web領(lǐng)域中,若想讓客戶端與服務(wù)端交互殃恒,我們首(或者說(shuō)唯一的)選的肯定是Http植旧。而隨著web應(yīng)用的快速發(fā)展,數(shù)據(jù)的消費(fèi)量和功能需求的強(qiáng)度也逐漸增加离唐,很顯然病附,傳統(tǒng)的Http模式早已不能滿足我們,更多的需求則希望服務(wù)端可以“主動(dòng)”跟客戶端通信來(lái)增加交互亥鬓。不得已完沪,long-polling逐漸的被實(shí)現(xiàn)在服務(wù)端,而這仍然是一種十分被動(dòng)的策略嵌戈。

002

傳統(tǒng)的Http很簡(jiǎn)單:客戶端主動(dòng)發(fā)起請(qǐng)求覆积,服務(wù)端接收到請(qǐng)求后立刻返回結(jié)果,一次“單向且即時(shí)的交流”就此完成熟呛。

003

那么問(wèn)題來(lái)了:如果客戶端不請(qǐng)求宽档,又想從服務(wù)端獲取信息,那該怎么辦呢庵朝?

試想下以下場(chǎng)景:

1.你的好友發(fā)了條Facebook吗冤,你想回復(fù)些什么又厉,正當(dāng)你typing的時(shí)候,發(fā)現(xiàn)突然多個(gè)一個(gè)“贊”椎瘟,如果你僥幸利用Network記錄了此過(guò)程覆致,你會(huì)詫異的發(fā)現(xiàn),并沒(méi)有什么請(qǐng)求發(fā)送肺蔚,那么這個(gè)“贊”又是如何更新到你的頁(yè)面的呢篷朵?

2.你修復(fù)了一個(gè)bug,git操作行云流水婆排,提交代碼后觸發(fā)了流水線,你倒杯茶靜靜的等待部署的結(jié)果笔链,lint-->build-->test-->deploy段只,這一連串的狀態(tài)更新與你無(wú)關(guān),它就像一個(gè)信號(hào)接收器一樣一直接收著來(lái)后端的信息鉴扫,這又是如何做到的呢赞枕?

其實(shí)web交互還有一些其他方式,下面的一些介紹坪创,也許會(huì)讓你對(duì)上面的疑問(wèn)有所解答炕婶。

004

Polling Request其實(shí)也是Http請(qǐng)求,它不停的循環(huán)莱预,使得在一些場(chǎng)景下柠掂,讓用戶誤以為它是“一直”在那里工作:譬如如果對(duì)準(zhǔn)確度要求不高,一些進(jìn)度條或者loading狀態(tài)的更新就可以采用這種辦法依沮,因?yàn)橛脩粼谝獾牟皇菧?zhǔn)確度涯贞,而是“它是否在工作”,以此來(lái)增強(qiáng)體驗(yàn)危喉。但大部分情況下宋渔,它都是傻瓜式的,輪訓(xùn)的時(shí)間段和處理邏輯的時(shí)間一旦沖突辜限,結(jié)果往往很難預(yù)料皇拣。

005

Long-Polling Request最大的差別是在于當(dāng)客戶端將請(qǐng)求發(fā)給服務(wù)端后,服務(wù)端并沒(méi)有立刻返回薄嫡,而是一直持有著這次交互氧急,一直等到服務(wù)端真正的獲取到信息之后,才會(huì)將結(jié)果返回給客戶端岂座。因此從表象看來(lái)态蒂,似乎客戶端已經(jīng)發(fā)送了請(qǐng)求,而頁(yè)面沒(méi)有立刻更新费什,那就代表結(jié)果為空钾恢,以為這次請(qǐng)求交互已經(jīng)結(jié)束手素,而過(guò)一會(huì),突然又更新了瘩蚪,“感覺(jué)”像是服務(wù)端主動(dòng)推送了數(shù)據(jù)泉懦,而實(shí)際上只是一次“延遲”的交互。

006

EventSource顧名思義疹瘦,在客戶端與服務(wù)端交互的過(guò)程中崩哩,是以事件進(jìn)行傳遞的,更確切的說(shuō)言沐,它是單向的邓嘹,但它和傳統(tǒng)Http恰好相反∠找龋客戶端和服務(wù)端一旦建立起鏈接汹押,事件只能由服務(wù)端向客戶端推送。不難看出起便,它非常適用于客戶端需要被動(dòng)實(shí)時(shí)頻繁更新信息的交互場(chǎng)景棚贾。如果你利用Network來(lái)調(diào)試,也是能夠清晰的看到event stream的榆综。

007

可有沒(méi)有什么辦法可以既可以讓客戶端從服務(wù)端獲取信息妙痹,且反之亦然呢?

008

不賣(mài)關(guān)子了鼻疮,主角登場(chǎng):WebSocket

與Http不同怯伊,WebSocket可以在沒(méi)有客戶端請(qǐng)求的情況下讓服務(wù)端主動(dòng)給客戶端發(fā)送數(shù)據(jù),客戶端和服務(wù)端可以實(shí)時(shí)地進(jìn)行雙向通信陋守,因此它非常適合“即時(shí)在線”的溝通震贵。

而在通信安全方面,WebSocket有著自己獨(dú)立的加密協(xié)議wss://水评,與Http類(lèi)似猩系,ws://并不被推薦,原因不言自明中燥。

WebSocket的使用也十分簡(jiǎn)單寇甸,客戶端建立鏈接如下:


const url = 'wss://myserver.com/something'

const connection = new WebSocket(url)

此時(shí)便可以訂閱相關(guān)事件:


connection.onopen = () => {}

connection.onerror = error => {}

009

用之前呢,我們還是最好看一下can I use

010

WebSocket的服務(wù)端實(shí)現(xiàn)的版本非常多疗涉,以Node.js為例拿霉,代碼片段如下:


npm i ws


const WebSocket = require('ws')

const wss = new WebSocket.Server({ port: 8080 })

wss.on('connection', ws => {
  ws.on('message', message => {
    console.log(`Received message => ${message}`)
  })
  ws.send('hello world!')
})

011

如果你有嘗試以上介紹做點(diǎn)小demo的話,你會(huì)發(fā)現(xiàn)咱扣,利用Network是可以看到所有明文的信息的绽淘,這種“暴露性”可能讓你感到不安。而如果你又很好奇的去看看某彈幕平臺(tái)的WebSocket信息闹伪,你會(huì)發(fā)現(xiàn)完全是加密沪铭,這一點(diǎn)和傳統(tǒng)的Socket通信也是類(lèi)似的植锉,這些信息其實(shí)都是經(jīng)過(guò)了某些算法進(jìn)行二進(jìn)制化岖瑰,但其實(shí)都是有固定的格式和校驗(yàn)碼的腿堤。

012

帶著這點(diǎn)好奇心腕唧,留下最后一個(gè)問(wèn)題:如何獲取到某直播平臺(tái)的彈幕(使用WebSocket)數(shù)據(jù)包呢?且如果WebSocket的信息又被二進(jìn)制化(或者加密)了呢赔退?

013

To be continued...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橙依,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子硕旗,更是在濱河造成了極大的恐慌窗骑,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漆枚,死亡現(xiàn)場(chǎng)離奇詭異慧域,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浪读,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辛藻,“玉大人碘橘,你說(shuō)我怎么就攤上這事≈。” “怎么了痘拆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)氮墨。 經(jīng)常有香客問(wèn)我纺蛆,道長(zhǎng),這世上最難降的妖魔是什么规揪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任桥氏,我火速辦了婚禮,結(jié)果婚禮上猛铅,老公的妹妹穿的比我還像新娘字支。我一直安慰自己,他們只是感情好奸忽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布堕伪。 她就那樣靜靜地躺著,像睡著了一般栗菜。 火紅的嫁衣襯著肌膚如雪欠雌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天疙筹,我揣著相機(jī)與錄音富俄,去河邊找鬼禁炒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛙酪,可吹牛的內(nèi)容都是我干的齐苛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼桂塞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凹蜂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阁危,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤玛痊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狂打,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體擂煞,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年趴乡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了对省。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晾捏,死狀恐怖蒿涎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惦辛,我是刑警寧澤劳秋,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胖齐,受9級(jí)特大地震影響玻淑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呀伙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一补履、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剿另,春花似錦干像、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至戚篙,卻和暖如春五鲫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岔擂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工位喂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浪耘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓塑崖,卻偏偏與公主長(zhǎng)得像七冲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子规婆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355