日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

websocket 历史及使用详解

發(fā)布時(shí)間:2025/3/18 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 websocket 历史及使用详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、閱前熱身

什么是keep-alive

1、keep-alive只是客戶端的一種建議

我們打開百度首頁(yè),進(jìn)一步查看header。

image_1b2idfp2k4ecu8pagh1mkutf39.png-415.7kB

如圖,我們看到請(qǐng)求header中有一行:

Connection:keep-alive復(fù)制代碼

keep-alive是通知服務(wù)器,在這個(gè)HTTP Request/Responset結(jié)束后,不要立即斷開TCP連接(注意是TCP連接,和HTTP沒有關(guān)系),后面的HTTP Request仍然可以通過這個(gè)TCP連接繼續(xù)傳送。

但是!這只是個(gè)建議,服務(wù)器可能不支持,也可能忽略掉這個(gè)建議。也可能因?yàn)闀r(shí)間太久而直接斷開TCP連接

通俗點(diǎn)解釋就是:keep-alive只是通知服務(wù)器,您先別掛,一會(huì)兒可能還有活兒,至于它掛不掛還是看它心情。

所以,keep-alive只是客戶端建議的一種復(fù)用TCP連接的方式,至于服務(wù)器支持不支持,就由不得客戶端了。

2、keep-alive只是http協(xié)議中的一部分

keep-alive是http協(xié)議中的一部分,也即客戶端可以主動(dòng)的發(fā)起request到服務(wù)器,服務(wù)器只能被動(dòng)的response給客戶端。

我要想實(shí)現(xiàn)服務(wù)器主動(dòng)的push消息給客戶端,keep-alive是無能無力的。

二、服務(wù)器的消息如何發(fā)給客戶端

long long ago~ 服務(wù)器端要想主動(dòng)的push消息給客戶端(比如網(wǎng)頁(yè)聊天室消息的即時(shí)收發(fā)),這是不可能滴。
但是,我可以使用ajax輪詢、long poll 技術(shù)造一個(gè)服務(wù)端給客戶端主動(dòng)push消息的假象。

①:什么是ajax輪詢?

ajax輪詢的原理非常簡(jiǎn)單,讓瀏覽器隔個(gè)幾秒就發(fā)送一次請(qǐng)求,詢問服務(wù)器是否有新信息。

場(chǎng)景再現(xiàn):

客戶端:啦啦啦,有沒有新信息(Request) 服務(wù)端:沒有(Response) 客戶端:啦啦啦,有沒有新信息(Request) 服務(wù)端:沒有。。(Response) 客戶端:啦啦啦,有沒有新信息(Request) 服務(wù)端:你好煩啊,沒有啊。。(Response) 客戶端:啦啦啦,有沒有新消息(Request) 服務(wù)端:好啦好啦,有啦給你。(Response) 客戶端:啦啦啦,有沒有新消息(Request) 服務(wù)端:。。。。。沒。。。。沒。。。沒有(Response) ---- loop復(fù)制代碼

但是這樣,有沒有發(fā)現(xiàn),大大增加了服務(wù)端的負(fù)載,并且速度還慢。

②:什么是long poll?

long poll和ajax差不多,原理都是采用輪詢的方式。只不過long poll是采取的阻塞的方式去輪詢。
也即客戶端發(fā)起一個(gè)請(qǐng)求連接,這個(gè)連接會(huì)阻塞住,直到服務(wù)端有了消息,才會(huì)response給客戶端。

注:阻塞、非阻塞的理解,請(qǐng)參考我之前的文章:nginx、swoole高并發(fā)原理初探

場(chǎng)景再現(xiàn):

客戶端:啦啦啦,有沒有新信息,沒有的話就等有了才返回給我吧(Request) 服務(wù)端:額。。 等待到有消息的時(shí)候。。來 給你(Response) 客戶端:啦啦啦,有沒有新信息,沒有的話就等有了才返回給我吧(Request) -loop復(fù)制代碼

long pull 雖然降低了服務(wù)器的負(fù)載,但是需要服務(wù)器有很高的并發(fā)能力才可以。
而目前處理高并發(fā)的模型基本都是異步非阻塞的模型(比如nginx)。

既想阻塞,又想高并發(fā),幾乎不可能。

③:總結(jié)

ajax輪詢、long poll技術(shù)雖然都能實(shí)現(xiàn)服務(wù)端消息的實(shí)時(shí)通知,但是各有缺點(diǎn),都不是根本的解決辦法。
計(jì)算機(jī)界急需一種新的技術(shù)去處理這些需求~

三、websocket來啦

既然ajax輪詢、long poll都不怎么樣。我們發(fā)明一種新的協(xié)議吧!

Websocket協(xié)議解決了服務(wù)器與客戶端全雙工通信的問題。

注:什么是單工、半雙工、全工通信?
信息只能單向傳送為單工;
信息能雙向傳送但不能同時(shí)雙向傳送稱為半雙工;
信息能夠同時(shí)雙向傳送則稱為全雙工。

websocket協(xié)議解析

wensocket協(xié)議包含兩部分:一部分是“握手”,一部分是“數(shù)據(jù)傳輸”。
為了便于演示,我們采用swoole建立一個(gè)websocket服務(wù)器來演示。

1、握手

①客戶端向服務(wù)端發(fā)起連接請(qǐng)求

image_1b2igg66d159v128qt59v2l48cm.png-59.3kB

如圖,我們?cè)谡?qǐng)求服務(wù)器的時(shí)候,發(fā)送了這樣的request header。

下面我們就一些比較重要的字段信息進(jìn)行說明:

Connection:Upgrade #通知服務(wù)器協(xié)議升級(jí) Upgrade:websocket #協(xié)議升級(jí)為websocket協(xié)議 Host:0.0.0.0:9501 #升級(jí)協(xié)議的服務(wù)主機(jī):端口地址 Sec-WebSocket-Key:K8o1cNIxO2pR6inTIDBSgg== #傳輸給服務(wù)器的key Sec-WebSocket-Version:13 #websocket協(xié)議版本13復(fù)制代碼

Sec-WebSocket-Key有什么用呢?
客戶端將這個(gè)key發(fā)送給服務(wù)器,服務(wù)器將這個(gè)key進(jìn)行處理,將處理后的key返回給客戶端,客戶端根據(jù)這個(gè)key是否正確來判斷是否建立連接。

②:服務(wù)端返回握手應(yīng)答

image_1b2ih7ard1oet1kangfig2uo01g.png-14.7kB
如圖,我們看到websocket協(xié)議狀態(tài)碼是101.

101表示協(xié)議切換成功。


我們查看websocket的response header。如圖:

image_1b2ih030qjdc1dllmshto0eph13.png-29.6kB

下面解釋下reponse header字段的含義

Connection:Upgrade #協(xié)議升級(jí)成功 Sec-WebSocket-Accept:GnoYH/ip/ZMh+a5rX5P/YR6e68g= #服務(wù)端處理之后的key Sec-WebSocket-Version:13#websocket 協(xié)議版本號(hào) Upgrade:websocket#協(xié)議升級(jí)為websocket復(fù)制代碼

至此,websocket握手成功!下面就盡情的傳輸數(shù)據(jù)吧!

2、數(shù)據(jù)傳輸

數(shù)據(jù)傳輸需要客戶端,沒什么好說的了。

  • Chrome/Firefox/高版本IE/Safari等瀏覽器內(nèi)置了JS語言的WebSocket客戶端
  • 可以使用一些擴(kuò)展來實(shí)現(xiàn)websocket客戶端。如php的swoole、workerman。

    注意:非WebSocket客戶端不能與WebSocket服務(wù)器通信

四、參考文章

Websocket協(xié)議之握手連接
WebSocket 是什么原理?為什么可以實(shí)現(xiàn)持久連接?

更多精彩,請(qǐng)關(guān)注公眾號(hào)“聊聊代碼”,讓我們一起聊聊“左手代碼右手詩(shī)”的事兒。

總結(jié)

以上是生活随笔為你收集整理的websocket 历史及使用详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。