成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

WebSocket協(xié)議 8 問

jaysun / 3275人閱讀

摘要:是個(gè)不太干凈協(xié)議。目前此協(xié)議的受眾的也不僅僅是開發(fā)者。借助協(xié)議進(jìn)行握手,握手成功后,就會(huì)變身為通道,從此與不再相見。如此操作,可以盡量避免普通請(qǐng)求被誤認(rèn)為協(xié)議。它包含四個(gè)事件和兩個(gè)動(dòng)作發(fā)送和關(guān)閉。有類似協(xié)議的幀格式,在此不做過多解釋。

WebSocket是一種比較新的協(xié)議,它是伴隨著html5規(guī)范而生的,雖然還比較年輕,但大多主流瀏覽器都已經(jīng)支持。它使用方面、應(yīng)用廣泛,已經(jīng)滲透到前后端開發(fā)的各種場(chǎng)景中。

對(duì)http一問一答中二式流程的不滿,催生了支持雙向通信的WebSocket誕生。WebSocket是個(gè)不太干凈協(xié)議。

一、WebSocket協(xié)議只能瀏覽器發(fā)起么?

不是。目前此協(xié)議的受眾的也不僅僅是web開發(fā)者。

WebSocket只是一種協(xié)議,它和http協(xié)議一樣,使用類似okhttp的組件,可以在任何地方進(jìn)行調(diào)用,甚至可以借助WebSocket實(shí)現(xiàn)RPC框架。

二、WebSocket和HTTP什么關(guān)系?

WebSocket和http一樣,都是處于OSI模型中的最高層:應(yīng)用層
WebSocket借助http協(xié)議進(jìn)行握手,握手成功后,就會(huì)變身為TCP通道,從此與http不再相見。

使用netstat或者ss,能夠看到對(duì)應(yīng)的連接,它與處于抽象層的socket,在外觀上沒有區(qū)別。

三、WebSocket和長(zhǎng)輪詢有什么區(qū)別?

長(zhǎng)輪詢,就是客戶端發(fā)送一個(gè)請(qǐng)求,服務(wù)端將一直在這個(gè)連接上等待(當(dāng)然有一個(gè)超長(zhǎng)的超時(shí)時(shí)間),直到有數(shù)據(jù)才返回,它依然是一個(gè)一問一答的模式。比如著名的comted。

WebSocket在握手成功后,就是全雙工的TCP通道,數(shù)據(jù)可以主動(dòng)從服務(wù)端發(fā)送到客戶端,處于鏈接兩端的應(yīng)用沒有任何區(qū)別。

WebSocket創(chuàng)建的連接和Http的長(zhǎng)連接是不一樣的。由于Http長(zhǎng)連接底層依然是Http協(xié)議,所以它還是一問一答,只是Hold住了一條命長(zhǎng)點(diǎn)的連接而已。

長(zhǎng)輪詢和Http長(zhǎng)連接是阻塞的I/O,但WebSocket可以是非阻塞的(具體是多路復(fù)用)。

四、如何創(chuàng)建一個(gè)連接?

WebSocket的連接創(chuàng)建是借助Http協(xié)議進(jìn)行的。這樣設(shè)計(jì)主要是考慮兼容性,在瀏覽器中就可以很方便的發(fā)起請(qǐng)求,看起來比較具有迷惑性。

下圖是一個(gè)典型的由瀏覽器發(fā)起的ws請(qǐng)求,可以看到和http請(qǐng)求長(zhǎng)的是非常相似的。但是,它只是請(qǐng)求階段長(zhǎng)得像而已:

請(qǐng)求的地址,一般是:ws://***,或者是使用了SSL/TLS加密的安全協(xié)議wss:,用來標(biāo)識(shí)是WebSocket請(qǐng)求。

1、 首先,通過Http頭里面的Upgrade域,請(qǐng)求進(jìn)行協(xié)議轉(zhuǎn)換。如果服務(wù)端支持的話,就可以切換到WebSocket協(xié)議。簡(jiǎn)單點(diǎn)講:連接已經(jīng)在那了,通過握手切換成ws協(xié)議,就是切換了連接的一個(gè)狀態(tài)而已。

1、Connection域可以認(rèn)為是與Upgrade域配對(duì)的頭信息。像nginx等代理服務(wù)器,是要先處理Connection,然后再發(fā)起協(xié)議轉(zhuǎn)換的。

Sec-WebSocket-Key 是隨機(jī)的字符串,服務(wù)器端會(huì)用這些數(shù)據(jù)來構(gòu)造出一個(gè) SHA-1 的信息摘要。如此操作,可以盡量避免普通 HTTP 請(qǐng)求被誤認(rèn)為 WebSocket 協(xié)議。

其他的,像Sec-WebSocket*字樣的頭信息,表明了客戶端支持的子協(xié)議以及其他信息。像loT中很流行的mqtt,就可以作為WebSocket的子協(xié)議。

使用javascript,可以很容易連接一個(gè)WebSocket服務(wù)端。

五、如何處理數(shù)據(jù)?

WebSocket是通過事件通知的方式運(yùn)行的。它包含四個(gè)事件和兩個(gè)動(dòng)作(發(fā)送和關(guān)閉)。

WebSocket的事件

事件 鉤子 備注
open onopen 連接建立時(shí)觸發(fā)
message onmessage 客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)
error onerror 通信發(fā)生錯(cuò)誤時(shí)觸發(fā)
close onclose 連接關(guān)閉時(shí)觸發(fā)

數(shù)據(jù)可直接通過Socket.send()方法進(jìn)行傳輸。

通過chrome的Inspect->Network->WS,可以看到頁面上的WebSocket連接。如圖Opcode為2,表明它是一個(gè)二進(jìn)制幀。

WebSocket有類似tcp協(xié)議的幀格式,在此不做過多解釋。

參考:(https://tools.ietf.org/html/r...

心跳

心跳對(duì)應(yīng)的ping、pong操作,opcode分別是0x9、0xA。收到心跳的一方需要自行更新心跳的更新時(shí)間。同使用Netty,我們到底在開發(fā)些什么?介紹的類似,在一些移動(dòng)環(huán)境中,需要更加智能的控制心跳。

六、如何使用Nginx做負(fù)載均衡?

nginx官網(wǎng)已經(jīng)給出了例子。主要是Upgrade和Connection頭的設(shè)置。

map $http_upgrade $connection_upgrade {
    default upgrade;
    "" close;
}

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

需要注意的是,nginx做負(fù)載均衡,不需要配置ip_hash等參數(shù),nginx天然支持。由于ip_hash僅使用ip地址的前三個(gè)數(shù)字做hash,還有可能造成服務(wù)端的不均衡。

七、java服務(wù)端怎么實(shí)現(xiàn)?

可以實(shí)現(xiàn)javax.WebSocket下的包,簡(jiǎn)單的實(shí)現(xiàn)ws服務(wù)端。目前基本可以通過注解的方式去編寫代碼,比如ServerEndpoint。

推薦使用基于netty的netty-socketio進(jìn)行服務(wù)端的編寫。由于使用的是netty,所以能夠在多個(gè)層面進(jìn)行切入,獲取一些統(tǒng)計(jì)數(shù)據(jù),執(zhí)行一些控制指令。socketio是一套解決方案,它有多個(gè)語言的客戶端,并處理了市面上大多數(shù)的兼容問題。

八、WebSocket能干些啥? 通知功能

保持一個(gè)長(zhǎng)連接,當(dāng)服務(wù)端游新的消息,能夠?qū)崟r(shí)的推送到使用方。像知乎的點(diǎn)贊通知、評(píng)論等,都可以使用WebSocket通信。

某些使用H5的客戶端,為了簡(jiǎn)化開發(fā),也會(huì)使用WebSocket進(jìn)行消息的通知,由于它是實(shí)時(shí)推送的,會(huì)有更好的用戶體驗(yàn)。

數(shù)據(jù)收集

一些次優(yōu)級(jí)別的數(shù)據(jù),比如行為日志、trace、異常執(zhí)棧收集等,都可以開辟專門的WebSocket通道進(jìn)行傳輸。這能夠增加信息的集中度,并能及時(shí)的針對(duì)用戶的行為進(jìn)行合適的配置推送。由于大多數(shù)瀏覽器內(nèi)核都支持,它將使客戶端APM編程模型變得簡(jiǎn)單。

加密 && 認(rèn)證

雖然使用Fiddler、Charles等能夠抓到很多WebSocket包。但如果同時(shí)開啟SSL,傳輸加密后的二進(jìn)制數(shù)據(jù),會(huì)大幅增加破解的成本,會(huì)安全的多。

反向控制鉤子

這個(gè)...由于是雙工長(zhǎng)連接,服務(wù)端完全可以推送一些鉤子命令,甚至直接是代碼,在客戶端進(jìn)行執(zhí)行。比如截個(gè)屏,錄個(gè)音,種個(gè)小馬。用戶只要通過了授權(quán)申請(qǐng),剩下的就隨你發(fā)揮了。

支付寶偷偷調(diào)用你的相機(jī)給你拍照的梗,我是相信的。

End

想當(dāng)年,cometd的出現(xiàn),驚為天人,振奮了很久。但技術(shù)日新月異,cometd已經(jīng)衰老,而Socket.io得到了快速發(fā)展。WebSocket經(jīng)過一段時(shí)間的混沌期,規(guī)范已經(jīng)越來越完善,使用也越來越方便,不需要再處理那么多的兼容。

但它的本質(zhì),還是新瓶裝舊酒,換湯不換藥。WebSocket的發(fā)展得益于HTML5規(guī)范的制定。規(guī)范的意義,就是約束廠商們天馬行空的實(shí)現(xiàn),以及指明發(fā)展的方向。

這當(dāng)然有典型的反例,那就是ie?,F(xiàn)在,只有一群公認(rèn)的**,還堅(jiān)持在用。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74020.html

相關(guān)文章

  • nodejs + websocket (socket.io)

    摘要:協(xié)議做不到服務(wù)器主動(dòng)向客戶端推送信息。這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。雙向通信,服務(wù)器可以向客戶端主動(dòng)發(fā)送數(shù)據(jù)。數(shù)據(jù)格式比較輕量,性能開銷小,通信高效。 為什么需要 WebSocket? 因?yàn)閭€(gè)人對(duì)概念理解不是很深,文字表達(dá)能力不強(qiáng),如果有關(guān)HTTP等方面描述不準(zhǔn)確,歡迎糾正,謝謝大家 初次接觸 WebSocket 的人,都會(huì)問同樣的問題:...

    awkj 評(píng)論0 收藏0
  • socket.io原理和實(shí)戰(zhàn)

    摘要:就是為了解決這一問題產(chǎn)生的,現(xiàn)在已經(jīng)寫入標(biāo)準(zhǔn),主流瀏覽器基本支持。 由于最近寫項(xiàng)目要使用socekt.io技術(shù),于是研究了一段時(shí)間,把自己早期學(xué)習(xí)階段寫的小游戲改造了一下,變成了一個(gè)比較完整的小程序。點(diǎn)擊這里可以體驗(yàn)游戲,建議使用手機(jī)模式查看,也可以下載打包好的webapp,安卓版已上架酷安市場(chǎng),掃碼可下載體驗(yàn): showImg(https://segmentfault.com/img...

    ivyzhang 評(píng)論0 收藏0
  • 前端面試之websocket

    摘要:服務(wù)器將資源復(fù)本寫到套接字,由客戶端讀取。釋放連接連接服務(wù)器主動(dòng)關(guān)閉套接字,釋放連接客戶端被動(dòng)關(guān)閉套接字,釋放連接。使用約定好的計(jì)算握手消息,并使用生成的隨機(jī)數(shù)對(duì)消息進(jìn)行加密,最后將之前生成的所有信息發(fā)送給網(wǎng)站。 還是同以往一樣,面試會(huì)考到的地方,我都會(huì)做出標(biāo)記,websocket如何在前端如何用的,這個(gè)得用,別這個(gè)都不知道,那這個(gè)教程就沒用了。如果你想對(duì)其原理進(jìn)行深入了解,那么本教程...

    codeGoogle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<