摘要:國(guó)際慣例,先上維基百科的解釋。維基百科上面是維基百科對(duì)的解釋?zhuān)瑒e問(wèn)我如何解釋上面這段話,因?yàn)槲乙矝](méi)看懂,那么下面我用人話解釋一下吧僅僅是我的理解是一個(gè)協(xié)議,可以簡(jiǎn)單看成是協(xié)議的一個(gè)補(bǔ)充協(xié)議,借助協(xié)議的基礎(chǔ)完成服務(wù)器主動(dòng)與客戶(hù)端實(shí)時(shí)傳輸數(shù)據(jù)。
現(xiàn)在,很多網(wǎng)站為了實(shí)現(xiàn)推送技術(shù),所用的技術(shù)都是輪詢(xún)。輪詢(xún)是在特定的的時(shí)間間隔(如每1秒),由瀏覽器對(duì)服務(wù)器發(fā)出HTTP request,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶(hù)端的瀏覽器。這種傳統(tǒng)的模式帶來(lái)很明顯的缺點(diǎn),即瀏覽器需要不斷的向服務(wù)器發(fā)出請(qǐng)求,然而HTTP request的header是非常長(zhǎng)的,里面包含的數(shù)據(jù)可能只是一個(gè)很小的值,這樣會(huì)占用很多的帶寬和服務(wù)器資源。
Ajax輪詢(xún)——“定時(shí)的通過(guò)Ajax查詢(xún)服務(wù)端"
而比較新的技術(shù)去做輪詢(xún)的效果是Comet,使用了AJAX。但這種技術(shù)雖然可達(dá)到雙向通信,但依然需要發(fā)出請(qǐng)求,而且在Comet中,普遍采用了長(zhǎng)鏈接,這也會(huì)大量消耗服務(wù)器帶寬和資源。
Comet——隨著AJAX技術(shù)興起而產(chǎn)生的新技術(shù)
用大白話揭開(kāi)Ajax長(zhǎng)輪詢(xún)(long polling)的神秘面紗
面對(duì)這種狀況,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊。
國(guó)際慣例,先上維基百科的解釋。
"WebSocket是HTML5開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。"
——維基百科
上面是維基百科對(duì)WebSocket的解釋?zhuān)瑒e問(wèn)我如何解釋上面這段話,因?yàn)槲乙矝](méi)看懂,那么下面我用人話解釋一下吧(僅僅是我的理解):
WebSocket是一個(gè)協(xié)議,可以簡(jiǎn)單看成是HTTP協(xié)議的一個(gè)補(bǔ)充協(xié)議,WebSocket借助HTTP協(xié)議的基礎(chǔ)完成服務(wù)器主動(dòng)與客戶(hù)端實(shí)時(shí)傳輸數(shù)據(jù)。
這是WebSocket和HTTP之間的關(guān)系,有交集,但是并不是全部。
WebSocket只是HTML5其中的一個(gè)API(HTML5推出了很多新的API,贊),這個(gè)API可以通過(guò)WebSocket協(xié)議實(shí)現(xiàn)WebSocket技術(shù)。
在WebSocket API中,瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。
關(guān)鍵點(diǎn)在于如何"握手",只要我們完成了握手的這個(gè)工作,那么WebScoket技術(shù)就算是能夠使用了。
前面說(shuō)了WebSocket與HTTP有交集的,或者可以說(shuō)WebSocket借助了HTTP的基礎(chǔ)就是體現(xiàn)在這里了,可以看到圖中的紅點(diǎn),分別是WebSocket的請(qǐng)求頭和響應(yīng)頭,一來(lái)一回,握手也就完成了,實(shí)時(shí)連接也就建立起來(lái)了!
下面講解一下幾個(gè)重要的頭參數(shù):
Request: Upgrade:WebSocket; //指定WebSocket協(xié)議 Sec-WebSocket-Version: 13 //指定Websocket Draft協(xié)議版本 Sec-WebSocket-Key:Cv8RLRCr07Ujlqexqq9Nrw== //驗(yàn)證key值,由瀏覽器隨機(jī)生成,可以理解為一個(gè)校驗(yàn)碼 Reponse: Connection:Upgrade ; Upgrade:webSocket;//沒(méi)錯(cuò)我就是webSocket Sec-WebSocket-Accept:rC+mM80welcslAqBHpav4MSDzAU= ;//這是返回頭校驗(yàn)碼,和請(qǐng)求頭的Key配對(duì) Sec-WebSocket-Version: 13 //指定Websocket Draft協(xié)議版本
以上就是一次完成的WebSocket握手,握手完之后就可以進(jìn)行實(shí)時(shí)通信了。
先上個(gè)代碼看看:
本文所用服務(wù)端語(yǔ)言為PHP,其他語(yǔ)言可以對(duì)照著看,大的原理都一樣:
WebSocket Demo下載鏈接(代碼實(shí)在太長(zhǎng),直接下載吧)
使用方法
Windows下要用cmd啟動(dòng)server.php文件,Linux同理 然后用瀏覽器訪問(wèn)index.html Demo是上網(wǎng)找的,不能當(dāng)做實(shí)際用途,簡(jiǎn)單看看運(yùn)行流程就好
代碼需要改的就是index.html的url和server.php的ip。
我講解幾個(gè)重要的模塊
server.php:
"127.0.0.1", "port"=>"8000", "event"=>"WSevent",//回調(diào)函數(shù)的函數(shù)名 "log"=>true, ); $websocket = new websocket($config); $websocket->run();
server.php:通過(guò)cmd運(yùn)行server.php,引用并實(shí)例化websocket.class.php類(lèi)庫(kù),并執(zhí)行run方法,使其充當(dāng)一個(gè)"服務(wù)器",持續(xù)掛著這個(gè)連接,當(dāng)客戶(hù)端有消息就做出對(duì)應(yīng)動(dòng)作。
Index.html:
websocket_TEST
Index.html:HTML5提供了WebSocket API,所以,客戶(hù)端實(shí)例化此API,參數(shù)為IP:端口,連接上服務(wù)端的WebSocket連接。
function roboot()
function roboot($sign,$t){ global $websocket; switch ($t) { case "hello": $show="hello,GIt @ OSC"; break; case "name": $show="Robot"; break; case "time": $show="當(dāng)前時(shí)間:".date("Y-m-d H:i:s"); break; case "再見(jiàn)": $show="( ^_^ )/~~拜拜"; $websocket->write($sign,"Robot:".$show); $websocket->close($sign); return; break; case "天王蓋地虎": $array = array("小雞燉蘑菇","寶塔震河妖","粒粒皆辛苦"); $show = $array[rand(0,2)]; break; default: $show="( ⊙o⊙?)不懂,你可以嘗試說(shuō):hello,name,time,再見(jiàn),天王蓋地虎."; } $websocket->write($sign,"Robot:".$show); }
function roboot():指定了客戶(hù)端的操作和服務(wù)端回復(fù)的信息,客戶(hù)端發(fā)送" 天王蓋地虎",服務(wù)端返回信息" 小雞燉蘑菇"/" 寶塔震河妖"/" 粒粒皆辛苦"。
文章最后來(lái)個(gè)小科普:
關(guān)于Socket 與 WebScoket
Socket 其實(shí)并不是一個(gè)協(xié)議。它工作在 OSI 模型會(huì)話層(第5層),是為了方便大家直接使用更底層協(xié)議(一般是 TCP 或 UDP )而存在的一個(gè)抽象層。
最早的一套 Socket API 是 Berkeley sockets ,采用 C 語(yǔ)言實(shí)現(xiàn)。它是 Socket 的事實(shí)標(biāo)準(zhǔn),POSIX sockets 是基于它構(gòu)建的,多種編程語(yǔ)言都遵循這套 API,在 JAVA、Python 中都能看到這套 API 的影子。
下面摘錄一段更容易理解的文字(來(lái)自 http和socket之長(zhǎng)連接和短連接區(qū)別):
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計(jì)模式中,Socket其實(shí)就是一個(gè)門(mén)面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對(duì)用戶(hù)來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
主機(jī) A 的應(yīng)用程序要能和主機(jī) B 的應(yīng)用程序通信,必須通過(guò) Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協(xié)議來(lái)建立 TCP 連接。建立 TCP 連接需要底層 IP 協(xié)議來(lái)尋址網(wǎng)絡(luò)中的主機(jī)。我們知道網(wǎng)絡(luò)層使用的 IP 協(xié)議可以幫助我們根據(jù) IP 地址來(lái)找到目標(biāo)主機(jī),但是一臺(tái)主機(jī)上可能運(yùn)行著多個(gè)應(yīng)用程序,如何才能與指定的應(yīng)用程序通信就要通過(guò) TCP 或 UPD 的地址也就是端口號(hào)來(lái)指定。這樣就可以通過(guò)一個(gè) Socket 實(shí)例唯一代表一個(gè)主機(jī)上的一個(gè)應(yīng)用程序的通信鏈路了。
而 WebSocket 則不同,它是一個(gè)完整的 應(yīng)用層協(xié)議,包含一套標(biāo)準(zhǔn)的 API 。
所以,從使用上來(lái)說(shuō),WebSocket 更易用,而 Socket 更靈活。
再簡(jiǎn)單來(lái)說(shuō), Socket是一個(gè)應(yīng)用程序接口,是抽象的,WebSocket和HTTP是具體實(shí)現(xiàn),
參考文章:
https://www.zhihu.com/question/20215561 《 知乎回答:什么是WebSocket?》
https://zh.wikipedia.org/wiki/WebSocket 《維基百科:WebSocket》
http://zengrong.net/post/2199.htm 《zrong"s blog》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30351.html
摘要:本文對(duì)過(guò)去和現(xiàn)在流行的實(shí)時(shí)推送技術(shù)進(jìn)行了比較與總結(jié)。以上我們介紹了三種實(shí)時(shí)推送技術(shù),然而各自的缺點(diǎn)很明顯,使用起來(lái)并不理想,接下來(lái)我們著重介紹另一種技術(shù)它是比較理想的雙向通信技術(shù)。 前言 隨著 Web 的發(fā)展,用戶(hù)對(duì)于 Web 的實(shí)時(shí)推送要求也越來(lái)越高 ,比如,工業(yè)運(yùn)行監(jiān)控、Web 在線通訊、即時(shí)報(bào)價(jià)系統(tǒng)、在線游戲等,都需要將后臺(tái)發(fā)生的變化主動(dòng)地、實(shí)時(shí)地傳送到瀏覽器端,而不需要用戶(hù)手動(dòng)...
摘要:長(zhǎng)輪循長(zhǎng)輪循是對(duì)定時(shí)輪詢(xún)的改進(jìn)和提高,目地是為了降低無(wú)效的網(wǎng)絡(luò)傳輸。是規(guī)范的一部分,它是一種流技術(shù),它的規(guī)范由兩部分組成,第一個(gè)部分是服務(wù)器端與瀏覽器端之間的通訊協(xié)議,第二部分則是在瀏覽器端提供使用的對(duì)象。下一篇之客戶(hù)端與服務(wù)器端的交互二 1. 長(zhǎng)鏈接技術(shù)介紹 說(shuō)到websocket,必須講到在它之前的各種長(zhǎng)鏈接技術(shù),比如輪循,長(zhǎng)輪循,sse等。長(zhǎng)鏈接顧名思義,就是讓客戶(hù)端瀏覽器與服務(wù)...
摘要:當(dāng)用戶(hù)注銷(xiāo)或退出時(shí),釋放連接,清空對(duì)象中的登錄狀態(tài)。聊天管理模塊系統(tǒng)的核心模塊,這部分主要使用框架實(shí)現(xiàn),功能包括信息文件的單條和多條發(fā)送,也支持表情發(fā)送。描述讀取完連接的消息后,對(duì)消息進(jìn)行處理。 0.前言 最近一段時(shí)間在學(xué)習(xí)Netty網(wǎng)絡(luò)框架,又趁著計(jì)算機(jī)網(wǎng)絡(luò)的課程設(shè)計(jì),決定以Netty為核心,以WebSocket為應(yīng)用層通信協(xié)議做一個(gè)互聯(lián)網(wǎng)聊天系統(tǒng),整體而言就像微信網(wǎng)頁(yè)版一樣,但考慮...
摘要:并且指定收到消息,以及端口的監(jiān)聽(tīng)方法。四代碼示例多房間實(shí)時(shí)聊天室配置版本須在里配置定義,并設(shè)置。使同一個(gè)的請(qǐng)求能夠落在同一個(gè)機(jī)器同一個(gè)進(jìn)程中。通過(guò)主進(jìn)程統(tǒng)一管理維護(hù)子進(jìn)程,每個(gè)進(jìn)程監(jiān)聽(tīng)一個(gè)端口。 showImg(http://7tszky.com1.z0.glb.clouddn.com/FkhApdRySR927nkdDZuUPBQbJtXG); 一、相關(guān)技術(shù)介紹: 消息實(shí)時(shí)推送,指的...
閱讀 3259·2021-09-22 15:58
閱讀 1724·2019-08-30 14:17
閱讀 1729·2019-08-28 18:05
閱讀 1514·2019-08-26 13:33
閱讀 692·2019-08-26 12:20
閱讀 616·2019-08-26 12:18
閱讀 3198·2019-08-26 11:59
閱讀 1412·2019-08-26 10:36